我正在用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] 删除。
我来说两句