视图和控制器之间的MVC4链接

时间:2013-07-08 05:44:26

标签: asp.net-mvc asp.net-mvc-4

我正在编写我的第一个MVC应用程序(MVC4)。很多都是使用VS2010中出色的Razor工具生成的,但现在我遇到了一堵墙,我觉得我不明白一些基本的东西。

在我的应用中,

  • 用户可以访问许多客户端。
  • 我有一个客户端控制器和视图。
  • 我有一个用户控制器和视图(简单的扩展版本 会员的UserProfile,使用User.Identity填充。

我想要做的是让用户编辑客户的详细信息,并在同一页面上编辑自己的帐户详细信息。

我尝试使用Html.Partial将UserProfile视图添加到客户端视图,但它试图将UserProfile视图传递给客户端模型。

如何让Client视图调用UserProfile controller ,以便它可以读取User.Identity并返回正确的UserProfile视图?

我尝试将其作为一个viewmodel,同时附加了client和userprofile类,并在一个屏幕上完成所有操作,但是在提交时拒绝向控制器发送值。

客户视图:

@model MyProject.Client
<div>
 @Html.Partial("_AcctDetailsPartial")
</div>
<div>
 @using (Html.BeginForm())
{
.
.
.
@Html.HiddenFor(model => model.ClientID)
{
.
.
.    
 <client fields>
{
.
.
.    
 <div class="form-actions">
      <button type="submit" name="ButtonName" value="Company" class="btn blue"><i class="icon-ok"></i> Save</button>
       <button type="button" class="btn">Cancel</button>
 </div>
}

</div>

UserProfile查看:

@model Surecall.UserProfile

<div style="height: auto;" id="accordion1-1" class="accordion collapse">
@using (Html.BeginForm())
{
        <h3 class="form-section">Personal Info</h3>
        <label class="control-label">First Name</label>
        @Html.TextBoxFor(m => m.FirstName, new { @class = "m-wrap span8", @id="FirstName" })
        <label class="control-label">Last Name</label>
        @Html.TextBoxFor(m => m.Surname, new { @class = "m-wrap span8" })
        <label class="control-label">Phone Number</label>
        @Html.TextBoxFor(m => m.Mobile, new { @class = "m-wrap span8" })
        <label class="control-label">Email</label>
        @Html.TextBoxFor(m => m.Email, new { @class = "m-wrap span8" })
        <label class="control-label">Position</label>
        @Html.TextBoxFor(m => m.Occupation, new { @class = "m-wrap span8" })
            <label class="control-label">Interests</label>
        @Html.TextBoxFor(m => m.Interests, new { @class = "m-wrap span8" })
        <div class="form-actions">
            <button type="submit" name="SaveLoginDetails" value="SaveUser" class="btn green"><i class="icon-ok"></i> Save</button>
            <button type="button" class="btn">Cancel</button>
        </div>
}

</div> 

1 个答案:

答案 0 :(得分:1)

您正在寻找的是Viewmodel。 现在,您的控制器将返回一个由“Client”类/模型组成的视图。但是你想要一个由Client + UserProfile组成的视图。

我不考虑工作,存储库和类似模式。您首先需要创建viewmodel

public class ClientUserProfileVM()
{
  public Client client {get; set; }
  public UserProfile user { get; set; } //use actual Usermodel here
}

在你的控制器中写下这样的东西

public ActionResult GetClientAndUser()
{
  ClientUserProfileVM viewmodel = here comes some LINQ magic
                                  select new ClientUserProfileVM {
                                                                  client,
                                                                  user
                                                                 };
  return View(viewmodel);
}

通过这种方式,您可以为自己的视图提供一个视图模型,该视图由客户和用户组成,您可以在视图中使用@model.user@model.client进行访问

有很多相互关联的链接:

ViewModel Best Practices

What is ViewModel in MVC?

http://www.youtube.com/watch?v=AkptHlDSKSQ