首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将不同的模型加载到部分视图中

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

Stack Overflow用户
提问于 2015-08-18 15:38:40
回答 4查看 128关注 0票数 0

我的主要观点是

代码语言:javascript
复制
@model IEnumerable<Ortund.Models.Reward>

我试图允许用户在这个视图上做几件事情,而不必去导航。

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

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

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

看起来是这样的:

/Home/Index

代码语言:javascript
复制
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

代码语言:javascript
复制
@model IEnumerable<Ortund.Models.Reward>
....

_ClaimsView

代码语言:javascript
复制
@model Ortund.Models.Receipt
....

_RedemptionView

代码语言:javascript
复制
@model IEnumerable<Ortund.Models.Reward>
....

我知道视图模型是首选的方法,但是由于我还没有想出如何正确地使用视图模型,所以我将采用这种方法。

我在另一个项目上这样做过,但这次我遇到了一个错误,即视图所需的字典时间与所提供的时间不同(在这个特定的例子中,我们在收据和奖励之间出现了混淆)。

我不知道该怎么做,只是手动构建表单,不与模型关联,而是将其发布到正确的控制器上.

EN

回答 4

Stack Overflow用户

发布于 2015-08-18 15:51:32

如果你使用一个模型,但是像这样构建:

代码语言:javascript
复制
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;}
}

然后,从您的视图中,您可以访问一个模型中的所有类,如:

代码语言:javascript
复制
@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 )
票数 0
EN

Stack Overflow用户

发布于 2015-08-18 17:38:07

默认情况下,调用@Html.Partial("PartialViewName")呈现的部分视图接受父视图的视图模型。

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

模型:

代码语言:javascript
复制
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; }
}

视图:

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

代码语言:javascript
复制
@model IndexModel

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

在单个页面上有多个窗体是另一个问题。请参阅同一页面中的多个表单ASP.net MVC

票数 0
EN

Stack Overflow用户

发布于 2015-08-18 18:26:58

所以,简而言之:使用一个视图模型?

是的,基本上。有这么多次,视图模型将被简单地要求来实现您所需要的东西,所以您最好学会使用它们。

然而,在这种情况下,您可以坚持更长的时间,因为您也可以实现您想要的使用子操作。从本质上说,这看起来是这样的:

控制器

代码语言:javascript
复制
[ChildActionOnly]
public ActionResult Rewards()
{
    // fetch rewards

    return PartialView("_Rewards", rewards)
}

视图

代码语言:javascript
复制
@Html.Action("Rewards")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32076804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档