提交带前缀的复杂模型

时间:2014-03-14 18:56:56

标签: asp.net-mvc model-binding

我想知道您对这种用于在MVC中提交复杂模型的方式的看法

例如,如果我有这样的复杂模型:

public class TOIFormDTO
{
     public TradeFormDTO Trade { get; set; }
     public OrderFormDTO Order { get; set; }
     public ItemFormDTO Item { get; set; }

     public TOIFormDTO() {
         Trade = new TradeFormDTO();
         Order = new OrderFormDTO();
         Item = new ItemFormDTO();
     }
}

然后,我将其绑定到表单中的视图:

@using (Html.BeginForm("SaveTOI", "Item", FormMethod.Post, new {id = "FormTOI" }))
{

    <div id="tabs" style="width:1100px; height:500px">

        <ul>
            <li><a href="#tabTrade">Trade</a></li>

            <li><a href="#tabOrder">Order</a></li>

            <li><a href="#tabItem">Item</a></li>
        </ul>


         <fieldset>
            <legend></legend>
            <div id="tabTrade">
                @Html.PartialForCustomPrefix(model => model.Trade, "~/Views/Trade/Trade.cshtml", "Trade")
            </div>

            <div id="tabOrder" style="display: none">
                @Html.PartialForCustomPrefix(model => model.Order, "~/Views/Order/Order.cshtml", "Order")
            </div>

            <div id="tabItem">
                @Html.PartialForCustomPrefix(model => model.Item, "~/Views/Item/Item.cshtml", "Item")
            </div>

        </fieldset>
    </div>
}

通过这种方式添加前缀:

public static MvcHtmlString PartialForCustomPrefix<TModel, TProperty>(this HtmlHelper<TModel> helper, System.Linq.Expressions.Expression<Func<TModel, TProperty>> expression, string partialViewName, string CustomPrefix)
{


    object model = ModelMetadata.FromLambdaExpression(expression, helper.ViewData).Model;
    var viewData = new ViewDataDictionary(helper.ViewData)
    {
        TemplateInfo = new System.Web.Mvc.TemplateInfo
        {
            HtmlFieldPrefix = CustomPrefix
        }
    };

    return helper.Partial(partialViewName, model, viewData);

}

这样,当提交表单时,模型被正确识别并且#39;通过行动:

public ActionResult SaveTOI(TOIFormDTO toiToSave)
{

}

你认为这是一个很好的方法,它是否可靠? 或者你认识到一些潜在的失败?

0 个答案:

没有答案