是否可以使用相同的post动作,但有两种不同的模型,使用的模型由当前用户的角色决定?我已经将我的真实场景简化为下面的示例,但我的想法是我有两个角色:经理和区域。管理员可以添加一个记录(让我们只是说它是这个例子中的用户)只有名字和姓氏。另一方面,区域可以与管理器相同,但还必须添加存储在嵌套视图模型和值类型属性上的多个其他信息,以及必要的数据注释。
我想使用这些单独的视图模型和视图,这样我就不必根据角色进行空检查或条件必需属性。另外,正如斯蒂芬在下面指出的那样,第二种/不同名称的动作方法也有效,但如果路线可以保持不变(用户/添加),那就太好奇了。
以下是我尝试的内容:
控制器
public ActionResult Add()
{
if (User.IsInRole("Regional"))
return View("AddRegional", new AddRegionalViewModel());
return View("Add", new AddViewModel());
}
[HttpPost]
public ActionResult Add(AddViewModel addViewModel)
{
// process manager add command
return RedirectToAction("List");
}
[HttpPost]
public ActionResult Add(AddRegionalViewModel addRegionalViewModel)
{
// process regional add command
return RedirectToAction("List");
}
查看模型
public class AddViewModel
{
[Required]
public string First { get; set; }
[Required]
public string Last { get; set; }
}
public class AddRegionalViewModel
{
[Required]
public string First { get; set; }
[Required]
public string Last { get; set; }
[Required]
public string Email { get; set; }
// in reality there are a LOT more value types / nested view models here
}
视图
Add.cshtml
@model ModelBindingHell.ViewModels.AddViewModel
@{
ViewBag.Title = "Add";
}
<h2>Add</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<div class="form-group">
@Html.LabelFor(model => model.First)
@Html.EditorFor(model => model.First)
@Html.ValidationMessageFor(model => model.First)
</div>
<div class="form-group">
@Html.LabelFor(model => model.Last)
@Html.EditorFor(model => model.Last)
@Html.ValidationMessageFor(model => model.Last)
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
}
AddRegional.cshtml
@model ModelBindingHell.ViewModels.AddRegionalViewModel
@{
ViewBag.Title = "Add";
}
<h2>Add</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<div class="form-group">
@Html.LabelFor(model => model.First)
@Html.EditorFor(model => model.First)
@Html.ValidationMessageFor(model => model.First)
</div>
<div class="form-group">
@Html.LabelFor(model => model.Last)
@Html.EditorFor(model => model.Last)
@Html.ValidationMessageFor(model => model.Last)
</div>
<div class="form-group">
@Html.LabelFor(model => model.Email)
@Html.EditorFor(model => model.Email)
@Html.ValidationMessageFor(model => model.Email)
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
}