4

我正在开发 MVC 应用程序。

我使用 viewbag 将值从控制器传递到视图,在 View 中我对来自 viewbag 的数据进行了一些更改。完成更改后,我想将更改后的数据发送回控制器。

所以我有一个查询,我可以将值分配给 View 中的 ViewBag 元素,我可以在控制器中使用这些值吗?

(数据来自,控制器 -> 视图 -> 控制器)

4

4 回答 4

1

真的应该使用模型来做这样的事情。这就是它的用途之一!另外,这是最佳实践。

考虑一下:

public class MyModel
{
    public string Value { get; set; }
}

然后这是您的HttpGet操作:

[HttpGet]
public MyAction()
{
    MyModel model = new MyModel();

    return View(model);
}

那么在你看来:

@model MyModel

@using(Html.BeginForm())
{
    @Html.LabelFor(m => m.Value)
    @Html.EditorFor(m => m.Value)
    <input type="submit" value="Save" />
}

那么你的HttpPost行动将是:

[HttpPost]
public ActionResult MyAction(MyModel model)
{
    //model.Value is the value you typed in
}

编辑:正如评论中所建议的,您可以为下拉列表值执行以下操作:

鉴于此模型:

public class MyModel
{
    public int SelectedId { get; set; }
    public List<SelectListItem> Selections { get; set; }
}

您可以按照自己的方式填充它HttpGet

[HttpGet]
public MyAction()
{
    MyModel model = new MyModel();

    model.Selections = db.Values //replace with your db table
        .Select(v => new SelectListItem
            {
                Text = v.Name //value to go in your text field
                Value = v.Id.ToString() //value to go in your ID field
            })
        .ToList();   

    return View(model);
}

然后在您看来,您可以执行以下操作:

@model MyModel

@using(Html.BeginForm())
{
    @Html.LabelFor(m => m.SelectedId)
    @Html.DropDownListFor(m => m.SelectedId, Model.Selections)
    <input type="submit" value="Save" />
}

然后这是你的HttpPost

[HttpPost]
public ActionResult MyAction(MyModel model)
{
    //model.SelectedId is the value you selected
}
于 2013-04-23T10:17:22.717 回答
0

这并不是真正的ViewBag设计目的 - 它实际上就是名称,它应该只包含用于将信息从控制器传递到视图的特定于视图的数据(而不是相反)。

将信息从视图传递到控制器的首选方式是通过POST对特定操作的请求。

于 2013-04-23T10:16:37.237 回答
0

您可以,但这样做不是最佳做法。视图主要用于向用户显示内容,用户所做的任何更改都应发送回控制器并在您的 ViewModel 中处理。

ViewBag主要用于将数据从控制器传递到视图,反之亦然。

从您的评论中:

查看此条目,它将帮助您了解如何将数据传回控制器并更新数据库:

http://weblogs.asp.net/scottgu/archive/2007/12/09/asp-net-mvc-framework-part-4-handling-form-edit-and-post-scenarios.aspx

于 2013-04-23T10:18:00.750 回答
0

据我所知,答案是否ViewBag。只能在服务器端处理。ViewBag 不能用于从渲染视图将数据发送回控制器。由于视图由视图引擎(服务器端)处理,然后将其呈现为 html,然后发送到浏览器(客户端)。现在您的选择是在客户端而不是服务器端进行的。因此,您需要编写一些 javascript(客户端代码)并将更改发送回服务器。

于 2013-11-28T18:13:43.157 回答