没有数据库持久性的简单表单更新

时间:2011-12-27 18:31:13

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

我有一个简单的ASP.NET MVC 3虚拟应用程序(只是学习来自WebForms的MVC)。

我对如何更新表单感到很困惑,而实际上并没有实际拥有一些数据库内容。我只有一个带有文本框的表单,按下按钮后我想看到大写的字符串。但我什么也没发生。

控制器:

    public ActionResult Index()
    {
        ToUppercaseModel model = new ToUppercaseModel { TheString = "testing" };

        return View(model);
    }

    [HttpPost]
    public ActionResult Index(ToUppercaseModel model)
    {
        model.TheString = model.TheString.ToUpper();

        return View(model);
    }

型号:

public class ToUppercaseModel
{
    [Display(Name = "My String")]
    public string TheString { get; set; }
}

观点:

@using (Html.BeginForm()) {
    <div>
        <div class="editor-label">
            @Html.LabelFor(m => m.TheString)
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(m => m.TheString)
        </div>
        <p>
            <input type="submit" value="Convert" />
        </p>
    </div>
}

我觉得这很简单。现在显然第二个索引方法中的return View(model);不起作用。我看到了一些关于RedirectToAction()的内容并将数据存储在TempData中。大多数示例只提交一些id,但因为我没有db不起作用。

如果我这样做:

return RedirectToAction("Index", model);

我得到了

  

没有为此对象定义无参数构造函数。

错误消息。这应该很简单,不是吗?我想我理解Post/Redirect/Get概念,但是没有看到如何将它应用于简单的事情。

感谢您的澄清。

3 个答案:

答案 0 :(得分:1)

您必须从2方法调用1方法,但您必须更改它

公共ActionResult索引(ToUppercaseModel模型)

并将模型发送给1方法。

public ActionResult Index(ToUppercaseModel? model)
    {
        if (model == null)    
        ToUppercaseModel model = new ToUppercaseModel { TheString = "testing" };
        return View(model);
    }

答案 1 :(得分:1)

当MVC呈现视图时,它将使用字段的尝试值而不是模型的值(如果存在)(例如,在我放置的日期字段中&#34;星期二&#34;,这赢得了&#39; t model bind但你想要向用户显示带有输入的字段并突出显示为无效),你要更改模型的值而不是尝试的值。

尝试的值保存在modelstate字典中:

ModelState["KeyToMyValue"].Value.Value.AttemptedValue

访问和更改这些值可能会非常棘手,除非您希望在代码中加载魔术字符串,并且在模型绑定时验证您的更改后的值将无法验证。

我在这些情况下的建议是调用ModelState.Clear(),这将删除所有验证和尝试的值,然后直接更改您的模型。最后,您希望使用TryValidateModel(yourModel)

对模型进行验证

请注意,此方法可能是最简单的非hacky方法,但会删除无法从返回的视图绑定的尝试值。

答案 2 :(得分:0)

我想我得到了一个解决方案,它有效,但不确定这是不是应该如此? 基本上我只是将我的模型放入TempData并再次调用普通的Index方法。

    public ActionResult Index()
    {
        ToUppercaseModel model = null;

        if (TempData["FeaturedProduct"] == null)
        {
            model = new ToUppercaseModel { TheString = "testing" };
        }
        else
        {
            model = (ToUppercaseModel)TempData["FeaturedProduct"];
        }
        return View(model);
    }


    [HttpPost]
    public ActionResult Index(ToUppercaseModel model)
    {
        model.TheString = model.TheString.ToUpper();

        TempData["FeaturedProduct"] = model;

        //return View(model);
        return RedirectToAction("Index");
    }