如何从视图 (MVC) 上的输入控件获取值



我正在开发小型 mvc 应用程序,有一点我需要控制器方法中的一个值, 我的计划是将该值存储在 ViewBag 中并在 View 上获取,所以我接下来做了:

ViewBag.SuccessBody = "This is a test";

在我的剃刀视图上,我接下来做了什么:

<input id="customInput" type="hidden" value='@(ViewBag.SuccessBody)' />

出于测试目的,我也尝试了以下示例..

<input id="customInputAgain" type="hidden" class="form-control" value="@(ViewBag.SuccessBody)">

当视图加载时,我试图获取一个值,所以我写了这个:

<script>
$(document).ready(function () {
var customVal = $("#customInput").val();
var customValAgain = $("#customInputAgain").val();
alert(customVal);
alert(customValAgain);
});
</script>

我什至尝试添加

alert(customVal.value);
alert(customValAgain.value);

但它也不起作用,所以看起来我没有从我的控制器/ViewBag 中检索值,这是原因 为什么警报显示空白空间 - 什么都没有。

编辑:

我在文章的编辑中设置此 ViewBag 值,实际上是在[HttpPost] EDIT上,因此当用户单击保存更改时[HttpPost] EDIT将调用该方法,并且当数据可能插入数据库时,我正在设置 ViewBag 值并将用户重定向到相同的 [HttpGet] 编辑方法。这是它的外观:

[HttpPost]
public ActionResult Edit(ArticleEditViewModel model)
{
if (ModelState.IsValid)
{
//Rest of the code
ViewBag.SuccessBody = "This is a test";
return RedirectToAction("Edit/" + product.Id, "Article");
}
else
{
return View("NotFound");
}
return View(model);
}

如您所见,我定义了ViewBag,但我无法获取应存储在输入控件中的视图上的值。

也许问题是因为我在 HttpPost Action 方法中定义了 ViewBag 而不是在 Http从哪里获取我正在"打开视图"?

我会使用.attr(),因为我更喜欢明确知道我的目标:

var customVal = $("#customInput").attr("value");

至于服务器端,请确保实际声明ViewBag.SuccessBody并返回一些内容。

public ActionResult FooAction()
{
ViewBag.SuccessBody = "This is a test";
return View();
}

此外,请确保将ViewBag.SuccessBody从正确的操作方法返回到相应的视图。

更新

根据您的编辑:您正在重定向到不同的操作(编辑[HttpGet]操作),因此显然ViewBag.SuccessBody没有定义在那里。为什么不直接将bool? editSuccess参数传递给[HttpGet]Edit 方法,指示编辑是否成功?

[HttpGet]
public ActionResult Edit(int id, bool? editSuccess)
{
if (editSuccess.HasValue) 
{
if (editSuccess)
{
// edit was successful here
ViewBag.SuccessBody = "Yay! :)";
}
else
{
// edit was unsuccessful here
ViewBag.SuccessBody = "No! :(";
}
} 
// other stuff
return View();
}

然后,您的[HttpPost]操作将变为:

[HttpPost]
public ActionResult Edit(ArticleEditViewModel model)
{
if (ModelState.IsValid)
{
// ...
RedirectToAction("Edit", new { id = product.Id, editSuccess = true });
}
else
{
// ...
}
}

使用此方法,您可以通过将editSuccess设置为false来指定编辑失败的时间。如果您只是对将任何值传递回视图感兴趣,请跳过所有editSuccess部分,只需从[HttpGet]操作中返回ViewBag.SuccessBody,而不是[HttpPost]操作。

旁白:显然,由于editSuccess是可选的,并且您仅在实际具有值时才ViewBag.SuccessBodyeditSuccess设置某些内容,因此您可以在视图中执行此检查以确定是否在HTML中输出某些内容:

@if (!string.IsNullOrEmpty(ViewBag.SuccessBody)) 
{ 
// not empty, do something
} 

你可以为此使用临时数据

[HttpPost]
public ActionResult Edit(ArticleEditViewModel model)
{
if (ModelState.IsValid)
{
//Rest of the code
TempData["SuccessBody"] = "This is a test"; ;
return RedirectToAction("Edit/" + product.Id, "Article");

}
else
{
return View("NotFound");
}
return View(model);
}

在你的获取方法中,使用这个

if (TempData["SuccessBody"] != null && TempData.ContainsKey("SuccessBody"))
ViewBag.SuccessBody = Convert.ToString(TempData["SuccessBody"]);

最新更新