0

我正在编写我的第一个 MVC 应用程序 (MVC4)。其中很多是使用 VS2010 中出色的 Razor 工具生成的,但现在我碰壁了,我觉得我不了解一些基本的东西。

在我的应用程序中,

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

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

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

如何让 Client 视图调用 UserProfile控制器,以便它可以读取 User.Identity 并返回正确的 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>

用户资料视图:

@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> 
4

1 回答 1

1

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

我不考虑工作、存储库和类似模式。您首先需要的是创建视图模型

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 最佳实践

MVC 中的 ViewModel 是什么?

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

于 2013-07-08T06:00:32.617 回答