Asp.net mvc 我可以将该值分配给视图中的viewbag元素并在控制器中使用它吗?

Asp.net mvc 我可以将该值分配给视图中的viewbag元素并在控制器中使用它吗?,asp.net-mvc,asp.net-mvc-3,model-view-controller,Asp.net Mvc,Asp.net Mvc 3,Model View Controller,我正在开发MVC应用程序 我使用viewbag将值从控制器传递到视图,在视图中,我对来自viewbag的数据进行了一些更改。 完成更改后,我想将更改后的数据发送回控制器 所以我有一个查询,我可以将值分配给视图中的ViewBag元素吗?这些值可以在控制器中使用吗 (数据从控制器->视图->控制器进行传输)这并不是ViewBag的真正设计目的-它都是以名称命名的,实际上,它应该只包含视图特定的数据,用于将信息从控制器传递到视图(而不是相反) 将信息从视图传递到控制器的首选方式是通过POST请求将信息

我正在开发MVC应用程序

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

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


(数据从控制器->视图->控制器进行传输)

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


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

您应该真的使用模型来执行类似操作。这就是它存在的原因之一!此外,这是最佳实践

考虑这一点:

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" />
}
编辑:正如评论中所建议的那样,下面是如何对下拉列表值进行编辑:

鉴于这种模式:

public class MyModel
{
    public int SelectedId { get; set; }
    public List<SelectListItem> Selections { get; set; }
}
在您看来,您可以执行以下操作:

@model MyModel

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

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

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

根据您的评论:

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


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

如果视图对数据进行修改,则说明您犯了严重错误。您忽略了“MVC”中的“M”(模型)。与其说你的要求不同(它们不是),不如看一下Mattytomo的答案并试一试。好吧,我有一个这样的例子,我有一个下拉列表,在下拉列表中选择的项目,它的前两个字符应该保存在DB中,所以我必须将数据从视图传递到控制器。我不知道该怎么做?@user1650894
ViewBag
字典在回发之间不存在,因此,正如我所说,如果您需要从视图中传递信息到控制器,您需要
POST
回发。这里有很多例子,@mattytomo和任何例子一样好。我有一个例子,比如,我有一个下拉列表,在下拉列表中选择的项目的前两个字符应该保存在DB中,所以我必须将数据从视图传递到控制器。我不知道该怎么做?@user1650894-你需要一个模型,该模型被发送到幕后的视图中(如@mattytommo所示)-然后通过
HTTP POST
将更改后的数据传递回控制器,并将其保存在数据库中,或者在视图模型的控制器中。@user1650894-我在回答中包含了一个链接,以帮助您理解如何实现这一点。不获取,我的请求。退出是不同的。。。我只想从视图中向控制器传递2个字符,这两个字符完全不同,它们与任何属性无关,有没有简单的方法?我有一个这样的例子,我有一个下拉列表,在下拉列表中选择的项目,它的前两个字符应该保存在DB中,所以我必须将数据从视图传递到控制器。不,我的问题是,假设我有国家下拉列表,如果我选择了美国,我将发送给我们,如果我选择了印度,我将发送2个字符,如,意味着我可以发送任何字符。所以我想知道更简单的方法。将数据传递给控制器。@user1650894您是否将该速记值存储在数据库中?如果是这样,您可以将
SelectListItem
值设置为该值。使用该模型是实现这一点的最简单和最佳实践方法。
[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]
public ActionResult MyAction(MyModel model)
{
    //model.SelectedId is the value you selected
}