MVC:向自己提交视图 - 避免返回URL

时间:2017-10-30 17:48:53

标签: c# asp.net-mvc razor

我是MVC的新手,我想创建一个简单的视图,允许用户输入一些数据=>提交表单=>在服务器上执行一些计算=>并将具有计算数据的模型回发到同一视图。 我发现了一种方法可以使它工作,但我不确定这是否是最好的方法,而且困扰我的是,在提交之后,模型属性中的所有数据都可以在浏览器地址栏中看到: http://localhost:53718/?Number=4&Result=16

以下是非常简化的szenario的代码:

模特:

public class CalculationModel
{        
    public int Number { get; set; }        
    public int Result { get; set; }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index(CalculationModel model)
    {
        return View(model);
    }

    [HttpPost]
    public ActionResult Calculate(CalculationModel model)
    {
        model.Result = model.Number * model.Number;
        return RedirectToAction("Index", "Home", model); 
    }
}

视图:

        @model WebApplication1.CalculationModel

    @{
        ViewBag.Title = "Home Page";
    }

    <h2>Simple Calculation</h2>

    @using (Html.BeginForm("Calculate", "Home", FormMethod.Post)){

        <div class="form-horizontal" data-crypto-conversion-form>
            <div class="form-group">
                <div class="input-group">
                    @Html.EditorFor(model => model.Number, new { htmlAttributes = new { @class = "form-control " } })
                </div>
            </div>

            <div class="form-group">
                <div class="input-group">
                    @Html.EditorFor(model => model.Result, new { htmlAttributes = new { @class = "form-control " } })
                </div>
            </div>

            <div class="form-group">
                <input type="submit" value="Convert" class="btn btn-primary btn-sm submitConversion" />
            </div>

        </div>
    }

我不确定从HttpPost方法执行RedirectToAction是否是一个好主意:return RedirectToAction(&#34; Index&#34;,&#34; Home&#34;,model); - 有更好的方法吗?

有没有办法阻止模型属性值显示在url / browser地址栏中?

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

RedirectToAction方法基本上返回302响应,并在位置标题中使用新网址,浏览器将向其发出新的GET请求。当您传递一个简单的模型时,它将被转换为查询字符串值,并将被添加到位置标题中的新网址。

如果您不想查看querystring中的值,可以使用HttpPost操作方法返回到具有相同视图模型对象的Index视图。确保清除模型状态字典,以便呈现Result属性的新值。您可以使用ModelState.Clear()方法执行此操作。

[HttpPost]
public ActionResult Calculate(CalculationModel model)
{
    model.Result = model.Number * model.Number;
    ModelState.Clear();
    return View("Index", model); 
}

如果您仍想返回A RedirectResult响应,则可以执行此操作,但可以通过TempData传递模型数据。看一下这篇文章

How do I include a model with a RedirectToAction?

答案 1 :(得分:0)

我会改变整体方法并使用相同的视图,因为看起来你可能想要一遍又一遍地计算。 获取索引方法只是为了显示要处理的数据和/或结果,然后是发布方法来进行实际处理。

所以,控制器:

[HttpGet]
public ActionResult Index()
{
    return View();
}

[HttpPost]
public ActionResult Index(CalculationModel model)
{
    model.Result = model.Number * model.Number;
    model.Processed = true;
    return View(model);
}

模型

public class CalculationModel
{
    public int Number { get; set; }
    public int Result { get; set; }
    public bool Processed { get; set; }
    public CalculationModel()
    {
        Processed = false;
    }
}

视图,仅在帖子后显示结果。

@model MvcApplication2.Models.CalculationModel
@{
    ViewBag.Title = "Home Page";
}
<h2>Simple Calculation</h2>
@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
 <div class="form-horizontal" data-crypto-conversion-form>
        <div class="form-group">
            <div class="input-group">
                @Html.EditorFor(model => model.Number, new { htmlAttributes = new { @class = "form-control " } })
            </div>
        </div>
        @*@(Model.Result)*@
        <div class="form-group">
            <div class="input-group">
                @*@Html.EditorFor(model => model.Result, new { htmlAttributes = new { @class = "form-control " } })*@
                @{if (Model!=null && Model.Processed)
                  {
                    <p>@(Model.Result)</p>
                  }
                }
            </div>
        </div>

        <div class="form-group">
            <input type="submit" value="Convert" class="btn btn-primary btn-sm submitConversion" />
        </div>
    </div>
}