ASP.NET MVC - 使用 Html.For 具有 类 不同表单视图模型的助手

ASP.NET MVC - Usinig Html.For helpers with classes different form view model

在我的控制器中,我有两种查看和订购产品的简单方法

[HttpGet]
public ActionResult Product(int id)
{
    Product product = Repository.GetProduct(id);
    return View(product);
}

[HttpPost]
public ActionResult Order(Order order)
{
    var orderResult = OrderProcessor.Process(order);
    return orderResult.Success ? View("OrderSuccess") : View("OrderFail");
}

订单 class 包含客户必须填写的视图中的字段:

public class Order
{
    public int ProductId { get; set; }

    [Range(1, 10, ErrorMessage = "Quantity must be a number from 1 to 10")]
    public int Quantity { get; set; }

    [Required(ErrorMessage = "Address not specified")]
    public string ShippingAddress { get; set; }

    // other order info
}

在我看来,我想对像 @Html.TextBoxFor(x => x.ShippingAddress) 这样的表单字段使用 HTML 助手来启用 Javascript 客户端验证。但问题是 MVC 只允许将这些助手用于视图模型的属性(在我的例子中是 Product class),而我的视图模型不包含 ShippingAddress.

为了让这些助手工作,我需要为 Product 视图的模型和 Order 方法的参数设置相同的 class。但这对我来说没有任何意义。视图模型应包含产品属性(名称、价格、描述等),而 POST 方法参数应包含用户输入(数量、地址等)。

我希望能够像这样使用具有 Order class 属性的 HTML 助手:

@Html.TextBoxFor<Order>(x => x.ShippingAddress)

有没有办法实现这个(也许通过对 MVC 的扩展)?或者是否有其他解决此问题的方法?

您的模型和视图模型之间存在差异。模型应该反映数据库,你的视图模型应该定制以适合视图。

您可以做的是创建一个视图模型,其中包含您有兴趣包含在视图中的所有属性,并使用数据库中的数据填充这些字段。

也许这不是最简洁的解决方案,但您的视图模型可以像这样简单:

public Order Order {get; set;}
public Product Product {get; set;}

在 GET 方法中,您可以获取要显示的订单和产品,并将其分配给视图模型。

无需寻找任何魔法。您也可以直接在产品模型中添加 "shipping address"。 添加那个有什​​么问题??