加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 从传递给局部视图的嵌套复杂对象获取值

发布时间:2020-12-15 19:39:58 所属栏目:asp.Net 来源:网络整理
导读:我有一个ViewModel,它有一个复杂的对象作为其成员之一.复杂对象有4个属性(所有字符串).我正在尝试创建一个可重复使用的部分视图,我可以传入复杂对象,并使用html帮助器为其属性生成html.这一切都很好.但是,当我提交表单时,模型binder不会将值映射回ViewModel
我有一个ViewModel,它有一个复杂的对象作为其成员之一.复杂对象有4个属性(所有字符串).我正在尝试创建一个可重复使用的部分视图,我可以传入复杂对象,并使用html帮助器为其属性生成html.这一切都很好.但是,当我提交表单时,模型binder不会将值映射回ViewModel的成员,所以我不会在服务器端返回任何东西.我如何读取用户输入复合对象的html帮助器的值.

视图模型

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)
}

部分视图

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

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

谢谢

编辑:我已经想到我需要在前面添加“ComplexModel”.在部分视图(文本框)中的所有控件的名称,以便映射到嵌套对象,但是我无法将ViewModel类型传递给部分视图以获取该额外的图层,因为它需要通用才能接受多个ViewModel类型.我可以用javascript重写name属性,但是对我来说似乎是过度贫民窟.我还能怎么做?

编辑2:我可以使用新的{Name =“ComplexModel.Name”}静态设置name属性,所以我认为我有事业,除非有更好的方法?

解决方法

您可以将前缀传递给部分使用
@Html.Partial("MyPartialView",Model.ComplexModel,new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "ComplexModel" }})

这将使前缀变为控制名称属性,以便< input name =“Name”../u0026gt;将成为< input name =“ComplexModel.Name”../u0026gt;并正确绑定到类型的MyViewModel在回发 编辑 为了使它更容易一些,您可以将其封装在一个html帮助器中

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 = name }
  };
  return helper.Partial(partialViewName,model,viewData);
}

并将其用作

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读