MVC - 在多个页面的下拉列表中显示用户配置文件设置

时间:2014-06-25 23:14:37

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

我想在每个页面的标题中显示特定用户配置文件设置的值(_Layout.cshtml)。我看到默认的MVC Web应用程序如何在"欢迎用户!"中显示用户的名字,但是这个名字是通过调用User.Identity.GetUserName()获得的。我想要显示的设置是自定义设置。

似乎我需要从控制器传递自定义设置,但我不确定如何从_Layout.cshtml中访问控制器。我已经尝试过@ Html.RenderPartial,但这并没有触发Controller Action /方法,或者可以吗?

我已经尝试了@ Html.RenderAction让我进入控制器,这需要渲染一个完整的视图,或者有解决方法吗?

有人可以告诉我在任何视图中使用什么剃刀语法来触发只渲染输入控件的Controller Action吗?除了return语句之外,我不需要Controller / Action逻辑。

修改

@Rowan Freeman似乎把我指向了我已经尝试过的方向。公平地说,他不知道我需要使用此用户设置执行POST。以下是我尝试过的代码:

视图模型

public class LanguageListPartialViewModel
{
    public string SelectedLanguage { get; set; }
    public IEnumerable<System.Web.Mvc.SelectListItem> Languages { get; set; }
}

〜/查看/共享/ _LanguageListPartial.cshtml

@model GPS_Web_App.Models.LanguageListPartialViewModel

@Html.DropDownListFor(
    x => x.SelectedLanguage,
    Model.Languages,
    new { @class = "form-control", onchange = "this.form.submit();" }
)

〜/查看/共享/ _Layout.cshtml

<form action="/Account/LanguageListPartial" method="post">
    @{Html.RenderAction("LanguageListPartial", "Account");} 
</form>

GET控制器操作

[AllowAnonymous]
[ChildActionOnly]
public ActionResult LanguageListPartial()
{
    // Logic to create a populate model's List<SelectListItem> Languages 
    // Logic to set model's string SelectedLanguage
    // Logic is already written and returns correct list.

    return PartialView("_LanguageListPartial", model);
}

POST控制器操作

[AllowAnonymous]
[HttpPost]
public async Task<ActionResult> LanguageListPartial(string SelectedLanguage)
{
    // Logic to set user profile setting to selection
    // Logic is already written and correctly sets user profile setting

    return RedirectToLocal(Request.UrlReferrer.AbsolutePath);
}

我在_Layout.cshtml中包装局部视图的原因是因为有时我只想在不同页面上的表单中显示列表 - 例如,EditProfile页面 - 它包含它自己的包装。我有一个警告,那就是PartialView有一个onSubmit(),它具有提交任何包含它的形式的不良效果。我稍后会解决这个问题。

上述布局的问题似乎是POST操作中的return() - 返回时呈现的页面只包含下拉列表,而不是在调用它的页面中呈现下拉列表。

1 个答案:

答案 0 :(得分:1)

Html.Action与部分视图结合使用。

你非常接近一个好的解决方案。让我澄清一下步骤。

  1. 创建局部视图。部分视图只是一个常规视图,但它们通常很小,并且用于要呈现的最终页面的部分。部分视图可能被称为“_ UserProfile.cshtml”。开头的下划线是指示局部视图的良好惯例。视图应使用简单模型,可能是UserProfileModel
  2. 创建适当的控制器和操作。可以调用控制器PartialsController,操作可能是UserProfile()。将属性[ChildActionOnly]附加到操作(或控制器),以便常规URL无法访问它。该行动应return PartialView("_UserProfile");
  3. 使用_Layout@Html.Action("UserProfile", "Partials")拨打电话