将不同模型加载到部分视图中

时间:2015-08-18 15:38:40

标签: asp.net-mvc

我的主视图使用

@model IEnumerable<Ortund.Models.Reward>

我试图允许用户在此视图上执行多项操作,而无需离开。

具体来说,我希望用户能够执行以下操作:

  • 查看他/她已声明的奖励(奖励此用户有资格兑换)
  • 领取新收据,并在此过程中,将与该收据相关的奖励添加到他/她当前的奖励中
  • 赎回他/她有资格获得的部分奖励,或者立即兑现所有奖励

我使用部分视图来实现这一点,因为我可以为每个部分设置一个新模型。

它看起来像这样:

/主页/索引

if (Request.Cookies["Ortund"] == null)
{
    // render a login form
}
else
{
    <p>@String.Format("Welcome, {0}!", Convert.ToString(Request.Cookies["Ortund"]["username"])) <a id="claim-link">Claim New</a> | <a id="redeem-link">Redeem</a></p>

    @Html.Partial("_RewardsView")

    <!-- Render the new claim and redemption views as well -->
    <div class="claim-new">
        @Html.Partial("_ClaimsView")
    </div>
    <div class="redemption">
        @Html.Partial("_RedemptionView")
    </div>

_RewardsView

@model IEnumerable<Ortund.Models.Reward>
....

_ClaimsView

@model Ortund.Models.Receipt
....

_RedemptionView

@model IEnumerable<Ortund.Models.Reward>
....

我知道视图模型是首选方法,但由于我还没有弄清楚如何正确使用视图模型,我采用这种方法。

我已经在另一个项目上完成了这项工作,但这次我收到的错误是说该视图所需的字典时间与提供的字典时间不同(在此特定情况下,我们&#39 ;收据和奖励之间的混淆)。

我不确定如何处理此问题,除非手动构建表单而不与模型关联,而是发布到正确的控制器...

4 个答案:

答案 0 :(得分:0)

如果您使用一个模型,但构建如下:

public class MainModel{
   public fakeOneModel fakeModelOneView{get; set;}
   public fakeTwomodel fakeModelTwoView{get; set;}
   public fakeThreemodel fakeModelThreeView{get; set;}
}

public class fakeOneModel{
    public string objectA1 {get; set;}
    public string objectA2 {get; set;}
    public string objectA3 {get; set;}
}

public class fakeTwoModel{
    public string objectB1 {get; set;}
    public string objectB2 {get; set;}
    public string objectB3 {get; set;}
}

public class fakeThreeModel{
    public string objectC1 {get; set;}
    public string objectC2 {get; set;}
    public string objectC3 {get; set;}
}

然后,根据您的观点,您可以从以下模型中访问所有类:

@Html.LabelFor(m=>m.fakeModelOneView.objectA1 )
@Html.TextBoxFor(m=>m.fakeModelOneView.objectA1 )
@Html.LabelFor(m=>m.fakeModelTwoView.objectB1 )
@Html.TextBoxFor(m=>m.fakeModelTwoView.objectB1 )
@Html.LabelFor(m=>m.fakeModelThreeView.objectC1 )
@Html.TextBoxFor(m=>m.fakeModelThreeView.objectC1 )

答案 1 :(得分:0)

默认情况下,通过调用@Html.Partial("PartialViewName")呈现的局部视图采用父视图的视图模型。

主页的模型应包含您将传递给部分视图的模型:

<强>型号:

public class IndexModel
{
    public Ortund.Models.Receipt Receipt { get; set; }
    public IEnumerable<Ortund.Models.Reward> ClaimedRewards { get; set; }
    public IEnumerable<Ortund.Models.Reward> EligibleRewards { get; set; }
}

查看:

调用局部视图时,请指定要传递给它的模型,例如

@model IndexModel

@Html.Partial("_RewardsView", Model.ClaimedRewards)
@Html.Partial("_ClaimsView", Model.Receipt)
@Html.Partial("_RedemptionView", Model.EligibleRewards)

在单个页面上有多个表单是另一个问题。看到 Multiple Forms in same page ASP.net MVC

答案 2 :(得分:0)

  

那么,简而言之:使用viewmodel?

是的,基本上。很多时候,只需要查看模型就可以实现您所需要的,只需学会使用它们。

但是,在这种情况下,您可以延长一段时间,因为您还可以使用子操作实现您正在寻找的内容。基本上,这看起来像这样:

<强>控制器

[ChildActionOnly]
public ActionResult Rewards()
{
    // fetch rewards

    return PartialView("_Rewards", rewards)
}

查看

@Html.Action("Rewards")

答案 3 :(得分:0)

如果您想使用ajax更新视图,那么您可以尝试MultiPartials。有了额外的好处,它们将更新您使用ID定义的任何元素,这意味着您可以使用数据更新多个div,而不必担心管理复杂的视图模型。

@using(Ajax.BeginForm("FormSubmit", new AjaxOptions { OnSuccess =      "MultipartialUpdate" }))
{
      <input type="submit" value="Submit">
}

}

然后在视图中

Colour = input("What's your favourite colour?")
print (Colour)

此代码段来自上述链接,您可以创建尽可能多的部分,而无需创建复杂的代码来管理所有部分。