0

我有使用 ASP.NET 表单的经验,但对 MVC 很陌生。

如何从回发的共享视图中获取数据?

在 ASP.NET Forms 中,我可以编写如下内容:

ASP.NET 表单:

型号代码:

public class MyModelItem
{
    // Just TextBox is enough for editing this
    public string SimpleProperty { get; set; }

    // For this property separate NestedItemEditor.ascx is required
    public MyModelNestedItem ComplexProperty { get; set; }
}

public class MyModelNestedItem
{
    public string FirstProperty { get; set; }        
    public string SecondProperty { get; set; }
}

行为:

用于编辑 MyModelNestedItem 的控件是单独的 ASCX 控件 NestedItemEditor.ascx

这只是举例,MyModelNestedItem 可能要复杂得多,我只是想说明一下我的意思。

现在,当我显示此项目进行编辑时,我显示了一个 asp:TextBox 和一个 NestedItemEditor.ascx。在页面回发上,我正在从两者收集数据,仅此而已。

MVC 的问题:

当我尝试使用 MVC 实现此场景时,我正在使用自定义的 EditorFor(通过使用 UIHint 并创建共享视图)。所以这个共享视图Views\Shared\EditorTemplates\MyModelNestedItem.cshtml现在可以显示已经在 MyModelNestedItem 属性中的数据,但我不知道如何让它返回新输入的数据。

当父控制器收到一个 post 请求时,数据似乎在 Request.Form 中,但是文明的到达方式是什么?当然,最好的解决方案是数据是否会自动提取到MyModelItem.ComplexProperty中。

4

2 回答 2

2

在 post 上调用的操作需要类似于:

    [HttpPost]
    public ActionResult Index(MyViewModel mdl)

然后,在表单上具有输入控件(或隐藏输入)的模型的所有属性都将具有在表单上输入的数据(或传递给它或由 javascript 修改,在隐藏输入的情况下)。

这假定 MyViewModel 是您的视图中引用的模型。

于 2012-06-15T12:24:51.960 回答
0

在控制器中使用复杂类型编写 ActionResult 方法对我来说很简单:

 public class Topic
{
    public Topic()
    {

    }
    public DetailsClass Details
    {
        get;
        set;
    }

}

public class DetailsClass
{
    public string TopicDetails
    {
        get;
        set;
    }
}

风景:

@modelTopic
@using (Html.BeginForm("Submit","Default"))
{
  @Html.EditorFor(m=>m.Details)
  @:<input type="submit" />
 }

控制器:

  public ActionResult Index()
    {

        Topic topic = new Topic();
        return View( topic); 
    }


    public ActionResult Submit(Topic t)
    {
        return View(t);
    }

提交时,Topic t包含我在编辑器中输入的值(假设您有一个复杂类型的自定义编辑器,在我的示例中为 DetailsClass)

于 2012-06-15T12:26:57.857 回答