我有一个页面,既可以作为查看页面,也可以作为编辑页面。显然,对于安全性,我只希望用户在获得授权后访问编辑功能。为了将编辑过的数据提交给服务器,我使用Html.BeginForm
方法在页面周围打包了一个表单。我的问题是,如果用户获得授权,我只需要创建该表单。这是我的代码:
if(UserIsAuthorised)
{
using(Html.BeginForm("update","page"))
{
//Code that happens regardless of whether or not the user is authorised
}
}
通过将整个事物包装在if
语句中,这意味着除非用户被授权,否则整个页面都是空白的,而不是应该如何。任何用户都应该能够查看该页面,但只有授权用户才能查看该页面。
我知道我可以手动写出form
标签,但我希望有一种更简单的方法
希望这很清楚。
答案 0 :(得分:2)
有点不清楚为什么你希望未经授权的用户看到Edit
页面,但是如果这是一个要求我会亲自尝试从View中重构这个逻辑并确定用户是否在Controller级别进行了身份验证。然后,您可以向客户端提供不同的视图。
例如:
public ActionResult Edit()
{
if (UserIsAuthorised)
{
return View("AuthenticatedEdit");
}
return View("UnauthenticatedEdit");
}
或者,您可以使用Controller上的Authorize
属性。
要更具体地回答您的问题,您可以使用else if
语句来满足您的需要。
if (UserIsAuthorised)
{
using(Html.BeginForm("update","page"))
{
//Code that happens regardless of whether or not the user is authorised
}
}
else if (!UserIsAuthorised) {
//Code that happens regardless of whether or not the user is authorised
}
然而,这会在视图中引入逻辑,这可能导致耦合和不可测试的代码。
答案 1 :(得分:0)
我实际上会做一些不同的事情,希望你能在项目中尽早完成这项任务。
首先,我不会混合只能由授权用户访问的项目区域,区域应该只能查看。因此,除了使用[授权]属性锁定操作之外,我还要分担关注点和责任。
但是,如果你无法做到这一点,我仍然不会建议将所有逻辑放在一个动作中。这将使维护项目更加困难。所以分开了。我建议创建两个动作。就这样:
namespace My.Sample
{
/// <summary>
/// Settings controller used to maintain settings stuff
/// </summary>
public class SettingsController : Controller
{
[Authorize]
public ActionResult EditSettings()
{
return View();
}
public ActionResult ViewSettings()
{
return View();
}
}
}
如果你担心的是你会在两个动作之间复制HTML标记,我会说不要那么担心。随着时间的推移,这两种观点开始大不相同,然后你不得不想知道如何将其作为一种观点来维持,并且你最终会得到一个巨大的观点cshmtl文件。拆分它,以后会让生活变得更轻松。
你可能不会寻找神学答案,但是......你应该阅读以下内容:
如果您仍然确信当前的方向,您可以从动作返回不同的视图并传入不同的模型。就这样:
[Authorize]
public ActionResult EditSettings()
{
var myModel = Services.SettingsService.GetSettings();
return View("ViewSettings", myModel);
}
因此,两个动作都指向一个视图,一个是授权的,一个不是。传入的模型可以反映不同的状态等。您的Razor标记可以根据需要做任何需要做的事情。我仍然不建议以这种方式做事,将这些行动分开。