我实例化'视图的GET请求中的对象,然后在发布表单时访问它。使用表单中的数据填充板对象。我还可以用它来存储传递的坐标吗?或者做我想要实现的目标的惯用方法是什么?
谢谢!
public class DrawingController : Controller
{
Plate plate;
[HttpGet]
public ActionResult Index()
{
plate = new Plate()
{
Holes = new Holes()
}
return View(plate);
}
// called by ajax when user clicks on "Save" to save the input coordinates
[HttpPost]
public void PassCoordinates(string coordinates)
{
// why is plate null here?
plate.Holes.coordinates = coordinates;
}
[HttpPost]
public ActionResult Index(Plate plate)
{
// I want to access plate.Holes.coordinates that I set in 'PassCoordinates'
// how can I achieve this?
}
}
答案 0 :(得分:1)
您看到的是预期的行为,因为 Http是无状态的。
每次调用action方法时,都会创建一个控制器的新对象。因此,在您进行ajax调用的情况下,它将创建DrawingController
的新对象,并且此对象将具有Plate
类型的属性,但未初始化为Plate
宾语。 (您在Index
方法调用中执行的操作)
如果您想获得相同的版块实例,可以使用PassCoordinates
操作方法以不同方式执行
让您的ajax调用发布Plate结构的js对象,并在Plate
类型的操作方法中有一个参数。提交请求时,模型绑定器将能够构建新对象并映射不同proeprties的值
将Plate对象存储在持久性meedium中并阅读。因此,在Index操作方法中,您将创建对象,初始化proprety值并将其存储到db table / Session状态等。您可以在第二个操作方法中从此处再次读取它。使用静态变量是另一种选择
如果您要选择#2选项并选择使用Session / Static变量,请记住您正在尝试将有状态行为添加到无状态http。 :(
恕我直言,选项1是要走的路。 保持Http的无状态行为。让您的客户端代码(进行ajax调用的代码)发送表示板对象的JS对象,并让模型绑定器为您构建对象。
当我查看你的代码时,PassCoordinates
方法唯一要做的就是设置Plate对象的Holes.coordinates
属性值(你可以在控制器中使用它)。您可以完全删除该方法,并确保在表单的输入元素中执行此操作,以便在将表单提交到HttpPost索引操作方法时,它将在请求正文中可用,模型绑定器将其映射到您的平板参数。
@model Plate
@using (Html.BeginForm("Index", "Home"))
{
@Html.TextBoxFor(a=>a.Holes.coordinates)
<button type="submit" class="btn" >Save</button>
}
这将在表单内创建一个名为Holes.coordinates
的输入元素。
<input id="Holes_coordinates" name="Holes.coordinates" type="text" value="">
输入一些值并提交表格。现在,如果在HttpPost操作方法中放置断点,则可以看到填充了板块对象Hole proprety,并且可以访问在coordinates
属性的文本框中输入的值。
现在你需要做的就是,无论客户端代码是进行ajax调用,而不是进行ajax调用,都要设置此输入的值。
$("#Holes_coordinates").val("some value you want");
一切正常后,只需将呼叫切换为HiddenFor
帮助,即可将可见文本框转换为隐藏输入。
@Html.HiddenFor(a=>a.Holes.coordinates)
答案 1 :(得分:1)
如果您希望维持每个用户
的请求的状态每种方法都有优点和缺点,没有更多信息,很难确定适当的选择。