2

返回视图时如何保持相同的数据?

我试图将表单返回到视图,但它不起作用。

有什么好的和简单的方法可以做到这一点吗?

[HttpPost]
public ActionResult Register(FormCollection form)
{
    string name = form["Name"].Trim();
    if (string.IsNullOrEmpty(name))
    {
        TempData["TempData"] = "Please provide your name ";
        return View(form);
    }

    string email = form["Email"].Trim();
    var isEmail = Regex.IsMatch(email, @"(\w+)@(\w+)\.(\w+)");
    if (!isEmail)
    {
        TempData["TempData"] = "Sorry, your email is not correct.";
        return View(form);
    }

      //do some things
}
4

1 回答 1

3

不知道你为什么会FormCollection在帖子中使用,但也许你来自 WebForms 背景。在 MVC 中,您应该使用 ViewModels 将数据传输到视图和从视图传输。

默认情况下,RegisterMVC 3 应用程序中的方法在视图中使用 ViewModel Register。你应该简单地把它发回去。事实上,如果您不知道作为 Internet 模板的一部分,默认应用程序已经为您创建了。

标准模式是有一个 ViewModel 代表您将在视图中使用的数据。例如,在您的情况下:

public class RegisterViewModel {

    [Required]
    public string Name { get; set; }

    [Required]
    [DataType(DataType.EmailAddress)]
    [Display(Name = "Email address")]
    public string Email { get; set; }
}

您的控制器应该包含 2 个动作, aGet和 a Post。呈现视图并Get准备好供用户输入数据。提交视图后,Post将调用该操作。View 将 ViewModel 发送到操作,然后该方法采取操作来验证和保存数据。

如果数据存在验证错误,将 ViewModel 返回给 View 并显示错误消息非常简单。

这是Get动作:

public ActionResult Register() {
    var model = new RegisterViewModel();
    return View(model);
}

这是Post行动:

[HttpPost]
public ActionResult Register(RegisterViewModel model) {
    if(ModelState.IsValid) { // this validates the data, if something was required, etc...
        // save the data here
    }
    return View(model); // else, if the model had validation errors, this will re-render the same view with the original data
}

您的视图看起来像这样

@model RegisterViewModel

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <div class="editor-label">
        @Html.LabelFor(model => model.Name)
    </div>
    <div class="editor-field">
        @Html.TextBoxFor(model => model.Name)  <br />
        @Html.ValidationMessageFor(model => model.Name)
    </div>
    <div class="editor-label">
        @Html.LabelFor(model => model.Email)
    </div>
    <div class="editor-field">
        @Html.TextBoxFor(model => model.Email)  <br />
        @Html.ValidationMessageFor(model => model.Email)
    </div>
}

使用其他策略在 MVC 应用程序中捕获和保存数据是绝对可能的,它是一个非常可扩展的框架。但是有一种特定的模式使 MVC 成为它的样子,并且与该模式相反的工作有时会被证明是困难的。对于初学者来说,最好先了解首选的模式和策略,然后一旦理解得很好,您就可以采用一些自己的自定义策略来满足您的需求。到那时,您应该对系统有足够的了解,知道您需要更改什么以及在哪里更改。

编码快乐!!

于 2012-06-09T11:51:29.550 回答