我想在每个页面的标题中显示特定用户配置文件设置的值(_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() - 返回时呈现的页面只包含下拉列表,而不是在调用它的页面中呈现下拉列表。
答案 0 :(得分:1)
将Html.Action
与部分视图结合使用。
你非常接近一个好的解决方案。让我澄清一下步骤。
UserProfileModel
。PartialsController
,操作可能是UserProfile()
。将属性[ChildActionOnly]
附加到操作(或控制器),以便常规URL无法访问它。该行动应return PartialView("_UserProfile");
。_Layout
从@Html.Action("UserProfile", "Partials")
拨打电话。