从传递给部分视图的嵌套复杂对象中获取数值

 2023-02-17    430  

问题描述

我有一个viewmodel,具有复杂对象作为其成员之一.复杂对象有4个属性(所有字符串).我正在尝试创建一个可重复使用的部分视图,其中我可以在复杂对象中传递,并使其使用HTML帮助程序为其属性生成HTML.这一切都很棒.但是,当我提交表单时,模型粘合剂没有将值映射回ViewModel的成员,因此我没有在服务器端返回任何东西.如何将用户类型读取到复杂对象的HTML帮助程序中的值.

ViewModel

从传递给部分视图的嵌套复杂对象中获取数值

public class MyViewModel
{
     public string SomeProperty { get; set; }
     public MyComplexModel ComplexModel { get; set; }
}

mycomplexmodel

public class MyComplexModel
{
     public int id { get; set; }
     public string Name { get; set; }
     public string Address { get; set; }
     ....
}

控制器

public class MyController : Controller
{
     public ActionResult Index()
     {
          MyViewModel model = new MyViewModel();
          model.ComplexModel = new MyComplexModel();
          model.ComplexModel.id = 15;
          return View(model);
     }

     [HttpPost]
     public ActionResult Index(MyViewModel model)
     {
          // model here never has my nested model populated in the partial view
          return View(model);
     }
}

查看

@using(Html.BeginForm("Index", "MyController", FormMethod.Post))
{
     ....
     @Html.Partial("MyPartialView", Model.ComplexModel)
}

p>局部视图

@model my.path.to.namespace.MyComplexModel
@Html.TextBoxFor(m => m.Name)
...

如何在表单提交上绑定此数据,以便父模型包含在Web表单上从局部视图中输入的数据?

感谢

编辑:我想出了我需要预付”复杂的模型”.在局部视图(文本框)中的所有控制中的所有名称中,使其映射到嵌套对象,但我无法将ViewModel类型传递给Pareial View以获得额外的图层,因为它需要通用接受多个ViewModel类型.我可以用javascript重写名称属性,但对我来说似乎过于贫地.我怎么能这样做?

编辑2:我可以静态设置new {name =”compleastmodel.name”}所以我认为我在商业中,除非有人有更好的方法?

推荐答案

您可以使用

将前缀传递给部分

@Html.Partial("MyPartialView", Model.ComplexModel, 
    new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "ComplexModel" }})

它将占用前缀控制name属性,以便<input name=”Name” ../>将变为<input name=”ComplexModel.Name” ../>并正确绑定到返回后的

上的typeof MyViewModel

编辑

要使它更容易,您可以将其封装在HTML Helper

public static MvcHtmlString PartialFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, string partialViewName)
{
  string name = ExpressionHelper.GetExpressionText(expression);
  object model = ModelMetadata.FromLambdaExpression(expression, helper.ViewData).Model;
  var viewData = new ViewDataDictionary(helper.ViewData)
  {
    TemplateInfo = new System.Web.Mvc.TemplateInfo 
    { 
      HtmlFieldPrefix = string.IsNullOrEmpty(helper.ViewData.TemplateInfo.HtmlFieldPrefix) ? 
        name : $"{helper.ViewData.TemplateInfo.HtmlFieldPrefix}.{name}"
    }
  };
  return helper.Partial(partialViewName, model, viewData);
}

并使用它作为

@Html.PartialFor(m => m.ComplexModel, "MyPartialView")

其他推荐答案

如果您使用标记助手,partial标签帮助程序接受一个for属性,这会有您所期望的.

<partial name="MyPartialView" for="ComplexModel" />

使用for属性,而不是典型的model属性,将导致部分内的所有表单字段以ComplexModel.前缀命名.

其他推荐答案

您可以尝试将ViewModel传递给Partial.

@model my.path.to.namespace.MyViewModel
@Html.TextBoxFor(m => m.ComplexModel.Name)

编辑

您可以创建一个基础模型并在那里推动复杂模型,并将基于模型传递给部分.

public class MyViewModel :BaseModel
{
    public string SomeProperty { get; set; }
}

 public class MyViewModel2 :BaseModel
{
    public string SomeProperty2 { get; set; }
}

public class BaseModel
{
    public MyComplexModel ComplexModel { get; set; }
}
public class MyComplexModel
{
    public int id { get; set; }
    public string Name { get; set; }
    ...
}

然后您的部分将如下:

@model my.path.to.namespace.BaseModel
@Html.TextBoxFor(m => m.ComplexModel.Name)

如果这不是可接受的解决方案,您可能必须在覆盖模型粘合剂方面进行思考.您可以阅读关于该这里.

以上所述是小编给大家介绍的从传递给部分视图的嵌套复杂对象中获取数值,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/34190.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。