具有多个重定向选项的Asp.net MVC取消按钮

时间:2012-05-02 15:34:26

标签: asp.net asp.net-mvc asp.net-mvc-3

我目前有一个带有提交和取消按钮的表单。根据某些逻辑,每次页面加载时,我都希望相同的取消按钮重定向到应用程序中的其他不同页面。这是我在aspx视图中的代码,它根据我的属性

更改了location.href
   <% if (Model.MyProperty.Equals("something"))
      { %>
       <input class="btnCancel" type="button" value="" onclick="location.href='<%: Url.Action("MyAction","MyController", new {Area="MyArea"},null)%>'" />
   <% } %>
   <% else if (Model.MyProperty.Equals("somethingelse"))
      { %>
       <input class="btnCancel" type="button" value="" onclick="location.href='<%: Url.Action("MyOtherAction","MyOtherController", new {Area="SomeOtherArea"},null)%>'" />
   <% } %>

这是正确而优雅的方式吗?如果有办法,我宁愿减少多个IF-ELSE条件。

感谢您的时间。

3 个答案:

答案 0 :(得分:5)

我总是处理多个重定向选项的方法是在控制器操作中设置href值。

View是通用的,但控制器操作特定于渲染页面的上下文。因此,在您的模型中,创建一个名为CancelUrl的属性。现在,在控制器操作中,将其设置为您希望它转到的链接。

model.CancelUrl = Url.Action("action", "controller");

这样,你在视图中所要做的就是说

<a href="@Model.CancelUrl">Text</a>

答案 1 :(得分:1)

您可以创建一个取消方法,该方法将您的属性作为参数并在控制器中适当地重定向。无论如何,这个逻辑可能不应该在你的视图中,因为视图应该几乎有0个逻辑

答案 2 :(得分:0)

我会在视图模型中使用将用于决定取消操作的属性(如您所有),以及任何其他必需属性。

例如:

public class IndexModel
{
    //any other properties you need to define here
    public string MyProperty { get; set; }
}

然后你的观点看起来类似于:

@model IndexModel

@using (Html.BeginForm())
{
    //other information you may want to submit would go here and in the model.

    @Html.HiddenFor(m => m.MyProperty)
    <button type="submit" name="submit" value="submit">submit</button>
    <button type="submit" name="cancel" value="cancel">cancel</button>
}

最后,您的帖子操作应该决定应该返回的下一个操作:

[HttpPost]
public ActionResult Index(IndexModel model)
{
    if (!string.IsNullOrEmpty(Request["submit"]))
    {
        if (ModelState.IsValid)
        {
            //any processing of the model here
            return RedirectToAction("TheNextAction");
        }
        return View();
    }

    if (model.MyProperty.Equals("something"))
    {
        return RedirectToAction("MyAction", "MyController", new { area = "MyArea" });
    }
    else //assumes the only other option is "somethingelse"
    {
        return RedirectToAction("MyOtherAction", "MyOtherController", new { area = "SomeOtherArea" });
    }
}