0

ASP.NET MVC(或者更确切地说是 Html.Helpers 和基页实现)假设将有一种类型用于呈现和发布(即模型)。

这是违反ISP的,不是吗?

我很想从自定义的EditPageBaseView<TViewModel, TFormData>.

问题是我想要针对 FormData 实例(存储在 ViewModel 中)进行验证和发布工作,但 MVC 假设整个 ViewModel 将被回发。

  1. 有没有一种OOB方式来促进这一点?(如果有的话我没有找到)。
  2. 为服务公开的不同操作(在这种情况下为视图)具有单独的数据类型是一个坏主意(在概念上)。
4

2 回答 2

0

它们不必匹配,但默认情况下它们确实匹配。

如果您不希望它们匹配,您可以在 Form 或 ActionLink 中指定不同的模型:

使用 Razor 和 C# 的不匹配示例:

索引.chtml:

@model FirstModel

<div>
@using (Html.BeginForm("Action", "ControllerName", new { ParameterName = new SecondModel { First = "First", Second = "Second" } }, FormMethod.Post)) {
<input type="submit" value="Submit Button" />
}
</div>

控制器:

public class ControllerName : Controller {

public ActionResult Index() {
return View(new FirstModel());
}

public ActionResult Action(SecondModel ParameterName) {
return View() // Where to now?
}
于 2013-03-05T15:48:42.967 回答
0

在构建视图模型时,我倾向于遵循 CQRS 模型。所有的渲染都是用ViewModel类完成的,所有的回发都是用Command类完成的。这是一个人为的例子。假设我们有一个用于创建用户的小表单视图。

ViewModelCommand看起来像这样:

public abstract class ViewModel {}

public abstract class Command: ViewModel

public class CreateUserViewModel : ViewModel
{
    public string Username { get; set; }
    public string Password { get; set; }
    public string PasswordConfirm { get; set; }
}

public class CreateUserCommand : Command
{
    public string Username { get; set; }
    public string Password { get; set; }
    public string PasswordConfirm { get; set; }
}

UserController创建 aCreateUserViewModel作为请求的模型,并Get期望CreateUserCommand请求a Post

public ActionResult CreateUser()
{
    // this should be created by a factory of some sort that is injected in
    var model = new CreateUserViewModel();
    return View(model);
}

[HttpPost]
public ActionResult CreateUser(CreateUserCommand command)
{
    // validate and then save the user, create new CreateUserViewModel and re-display the view if validation fails
}

模型绑定负责确保CreateUserCommand正确填充 Posted 的属性,即使 Get View 绑定到CreateUserViewModel.

于 2013-01-16T16:39:18.197 回答