【问题标题】:Passing data from Controller to a User Control View with ASP.NET MVC使用 ASP.NET MVC 将数据从控制器传递到用户控件视图
【发布时间】:2010-09-29 01:05:04
【问题描述】:

我有一个视图类 (OrderView.aspx),它通过中继器控件显示订单的详细信息(帐户名称、订单日期)以及订单行列表。每个订单行由一个用户控制视图 (OrderLineView.ascx) 表示,该视图显示订单行的详细信息(项目名称、数量、价格)。我有一个名为 Order 的模型对象,我将其用作所有这些的数据源,并将其作为视图的模型对象传递。

每个 OrderLineView 用户控件都有一个保存和删除按钮。我有 Save 按钮将 OrderLine 控件中的表单内容发布到 Controller 上的 Save 方法,然后 RedirectToAction 回到同一个 Order 页面(这会刷新整个页面,没有关于它的 AJAXy)。我有删除按钮链接到控制器上尝试删除的方法,然后 RedirectToAction 回到同一个订单页面。但是,如果删除失败,我希望当页面再次呈现时,删除按钮旁边会显示一个小错误消息(请记住,页面上的每个订单行都有一个删除按钮,所以我只希望消息旁边我点击的那个)。我的问题:

1 - 我如何将这些数据从我的控制器方法传递到特定的用户控件?我应该以某种方式将其添加到模型中吗?似乎是个坏主意(因为它确实不是模型的一部分)。

2 - 我应该有一个 OrderLineController 用于 OrderLine 操作以及一个 OrderController 用于 Order 操作吗?我只是想知道最佳做法是否为每个视图都有一个单独的控制器。

3 - 我看到有些人可能会使用这样的匿名类型值调用 RedirectToAction:

RedirectToAction("ViewOrder", new { Id = 1234, Message = "blabla"});

但这会使消息值显示在 URL 字符串中。我同意,但如果可能的话,我希望它不显示。

4 - 另外,为了从视图中访问模型的属性,我发现自己一直在这样做:

foo(((someModelType) this.ViewData.Model).SomeProperty);

我不喜欢这个有很多原因,其中之一是我不希望我的视图与我的模型类型相结合(这就是我使用 ViewPage 而不是 ViewPage 的原因) .我更希望能够有这样的电话:

foo(ModelEval("SomeProperty"));

有这样的事吗?我自己写了,但如果我不需要的话,我会喜欢的。

【问题讨论】:

    标签: asp.net-mvc user-controls


    【解决方案1】:

    1

    查看模型状态。

    ViewData.ModelState.AddModelError("something.Name", "Please enter a valid Name");
    

    ModelState 实际上是一个字典,因此您可以在每个控件的基础上识别错误。我不知道这是否是最佳做法,但它可能会奏效。 尝试类似

    ViewData.ModelState.AddModelError("something#3.Name", "Please enter a valid Name");
    

    在你看来,你可以把

    <%= Html.ValidationMessage(string.format({"something{0}.Name", YourUniqueId))%>
    

    4

    您可以强类型化您的视图,因此您不需要强制转换,但如果您担心紧密耦合,这可能会让您望而却步。但是拥有强类型没有比让魔术字符串指向模型的该属性更紧密的耦合了。前者只是给你类型安全和智能感知的荣耀。

    【讨论】:

      【解决方案2】:

      由于您的 OrderLine 有一个唯一的 ID,您可以使用它来构造要放置在 ModelState 错误容器中的键。

      public ActionResult Delete(int? Id)
      {
          ModelState.AddModelError("OrderLine" + Id.Value, "Error deleting OrderLine# " + Id.Value);
      
          ...    
      }
      

      然后使用 ValidatinoMessage 助手。这将检查 ModelState 以查看是否存在错误,如果存在,它将显示消息。否则为空。

      <%= Html.ValidationMessage ("OrderLine" + Id)%>
      

      在 MVC 的下一个版本中,模型将成为顶级属性,因此以下

      foo(((someModelType) this.ViewData.Model).SomeProperty);
      

      可以写成

      foo(Model.SomeProperty);
      

      除非您使用 public object 作为属性,否则应该已经键入模型对象?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-11
        • 1970-01-01
        • 1970-01-01
        • 2014-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多