如何在管理MVC 4应用程序中重用模型和视图以进行添加和编辑

dlght

我正在用C#构建MVC 4应用程序,并且我一直在做很多彼此非常相似的添加和编辑视图。我的问题是如何通过填充用于添加和编辑项目的表单,对返回的对象使用与模型相同的视图。这是我在我的应用程序中所做的示例:

@model namespace.Register
@{
    ViewBag.Title = "Manage User";
}

<div class="col1 manage-user">
<div>   
    @using (Html.BeginForm())
    {
        <h1>Add User</h1>
        <div id="error" class="clear">@Html.ValidationSummary(true)</div>
        <ul class="clear">
            <li><label for="UserName">Username:</label>
                @Html.EditorFor(x => x.UserName)
            </li>
            <li><label for="Password">Password:</label>
                @Html.EditorFor(x => x.Password)
            </li>
            <li><label for="ConfirmPassword">Confirm password:</label>
                @Html.EditorFor(x => x.ConfirmPassword)
            </li>
            <li>
                <label for="level">Level:</label>
                @Html.DropDownList("levels", Model.Elements.Levels)
            </li>
        </ul>

        <div class="buttons">
            <input type="submit" class="button create" value="Save" name="Save"/>
            <input type="submit" class="button back" value="Back" name="Back" formnovalidate/>
        </div>
    }
</div>

和我的添加方法:

public ActionResult AddUser()
    {
        Levels levels = new Levels(MyRepository.GetLevelsForUser(User.Identity.Name));
        Register model = new Register(levels);
        return View(register);
    }

    [HttpPost]
    public ActionResult AddUser(Register model, FormCollection form)
    {
        if(form["Back"] != null)
        {
            return RedirectToAction("UserList");
        }

        if (ModelState.IsValid)
        {
        ... add user logic
        }    

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "Please enter valid username and password.");
        return View(model);
    }

当我编辑时,我需要打开与AddUser相同的视图,但在模型中填充适当的属性,然后发布以保存模型中的更改。目前,我使用ViewData [“ Username”],||-|| “密码”,因此要执行此操作,有没有更好的方法可以重用此AddUser视图?

寄存器模型如下

public class Register
{       
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }

    public Levels Levels { get; set; }

    public Register()
    {
        UserName = null;
        Password = null;
        ConfirmPassword = null;
        Levels = null;
    }

    public Register(Levels levels)
    {
        UserName = null;
        Password = null;
        ConfirmPassword = null;
        Levels = levels;
    }   
}
亚历克斯

我通常EditorTemplate为此目的利用功能,将专用部分视图中的通用部分解耦。

遵循一个基于您的代码的示例(请注意BeginForm,每个标签都各不相同,而“肉”的形式是从部分中挖出的):

注意:这只是一个示例,可能可以剥离得更多,但这更多是概念证明。

添加视图cshtml

@model namespace.Register
@{
    ViewBag.Title = "Manage User";
}

<div class="col1 manage-user">
<div>   
    @using (Html.BeginForm("AddUser", "YourController", FormMethod.Post))
    {
        <h1>Add User</h1>

        @Html.EditorFor(model => Model)

        <div class="buttons">
            <input type="submit" class="button create" value="Create user" name="Save"/>
            <input type="submit" class="button back" value="Back" name="Back" formnovalidate/>
        </div>
    }
</div>

编辑视图cshtml

@model namespace.Register
@{
    ViewBag.Title = "Manage User";
}

<div class="col1 manage-user">
<div>   
    @using (Html.BeginForm("UpdateUser", "YourController", FormMethod.Post)
    {
        <h1>Edit User</h1>

        @Html.EditorFor(model => Model)

        <div class="buttons">
            <input type="submit" class="button create" value="Update user" name="Save"/>
            <input type="submit" class="button back" value="Back" name="Back" formnovalidate/>
        </div>
    }
</div>

上面的两个视图都将利用此文件(名称不是由MVC命名约定所决定的)。

\ Views \ Shared \ EditorTemplates \ Register.cshtml

@model namespace.Register
<div id="error" class="clear">@Html.ValidationSummary(true)</div>
<ul class="clear">
    <li><label for="UserName">Username:</label>
        @Html.EditorFor(x => Model.UserName)
    </li>
    <li><label for="Password">Password:</label>
        @Html.EditorFor(x => Model.Password)
    </li>
    <li><label for="ConfirmPassword">Confirm password:</label>
        @Html.EditorFor(x => Model.ConfirmPassword)
    </li>
    <li>
        <label for="level">Level:</label>
        @Html.DropDownList("levels", Model.Elements.Levels)
    </li>
</ul>

这也适用于显示数据,完全相同的原理适用,但部分输入\Views\Shared\DisplayTemplates并通过使用DisplayFor()

可以为模板指定任何名称,但是如果名称与类型不匹配,则必须使用EditorFor/的重载,该重载DisplayFor将视图名称作为参数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用一个模型和多个视图对Java SWT应用程序进行编程?

我如何在ionic 4应用程序中添加和使用引导程序

如何在Ruby on Rails应用程序中编辑和管理“ select_tag options_from_collection_for_select”?

如何在Django管理中添加编辑和删除按钮

如何在Spring MVC中管理会话

如何在MVC模式中管理多种形式

如何使用GEKKO在模型预测控制应用程序中管理采样和命令时间

如何在 kafka 和 spark-sql 流应用程序中管理审计?

如何在Tornado应用程序中管理资源的异步启动和关闭?

如何在MVC 4 Web应用程序中更改默认视图

如何在基于Java / JVM的应用程序中拟合和评分机器学习模型

使用Identity Server 4刷新同时包含视图和资源的MVC Core应用程序中的访问令牌的最佳实践

如何在 tvos 应用程序中连接按钮和集合视图?

如何使添加和编辑按钮像在警报应用程序中一样

如何在MVC应用程序和控制台应用程序之间共享信息

MVC 4重用视图和视图模型最佳实践

如何在本机应用程序(Android / iOS)中对用户进行身份验证和记住?

如何在静态库中进行AFNetworking和iOS中的主要应用程序?

如何在闪亮的应用程序中的sankey图中对源和/或目标节点进行排序?

如何在AIR Android应用程序中在JS和AS3之间进行通信?

如何在Android Studio中的Android应用程序中进行条款和条件活动

如何在Ionic 4应用程序中更改默认的应用程序图标和启动画面?

如何在React和Node应用程序中添加加载微调器?(Nodemailer)

如何在“应用程序”菜单中添加和更改项目?

如何在Facebook应用程序中添加画布和安全的画布URL

如何在 Netlify 中添加 .env 文件和托管 React 应用程序?

如何在最小的Ubuntu中添加应用程序和GUI?

如何在现有的Apple Watch应用程序中添加和运行Glance?

如何在wpf应用程序中添加公制和英制系统