终止if语句而不终止子代码

时间:2015-03-22 14:15:55

标签: c# .net asp.net-mvc razor

我有一个页面,既可以作为查看页面,也可以作为编辑页面。显然,对于安全性,我只希望用户在获得授权后访问编辑功能。为了将编辑过的数据提交给服务器,我使用Html.BeginForm方法在页面周围打包了一个表单。我的问题是,如果用户获得授权,我只需要创建该表单。这是我的代码:

if(UserIsAuthorised)
{
    using(Html.BeginForm("update","page"))
    {
        //Code that happens regardless of whether or not the user is authorised
    }
}

通过将整个事物包装在if语句中,这意味着除非用户被授权,否则整个页面都是空白的,而不是应该如何。任何用户都应该能够查看该页面,但只有授权用户才能查看该页面。

我知道我可以手动写出form标签,但我希望有一种更简单的方法 希望这很清楚。

2 个答案:

答案 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文件。拆分它,以后会让生活变得更轻松。

你可能不会寻找神学答案,但是......你应该阅读以下内容:

https://softwareengineering.stackexchange.com/questions/73065/what-are-dry-kiss-solid-etc-classified-as

如果您仍然确信当前的方向,您可以从动作返回不同的视图并传入不同的模型。就这样:

        [Authorize]
        public ActionResult EditSettings()
        {
            var myModel = Services.SettingsService.GetSettings();
            return View("ViewSettings", myModel);
        }

因此,两个动作都指向一个视图,一个是授权的,一个不是。传入的模型可以反映不同的状态等。您的Razor标记可以根据需要做任何需要做的事情。我仍然不建议以这种方式做事,将这些行动分开。