ASP.NET MVC 5:在Controller

时间:2017-11-17 20:44:07

标签: asp.net-mvc

我实例化'视图的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?
        }
}

2 个答案:

答案 0 :(得分:1)

您看到的是预期的行为,因为 Http是无状态的

每次调用action方法时,都会创建一个控制器的新对象。因此,在您进行ajax调用的情况下,它将创建DrawingController的新对象,并且此对象将具有Plate类型的属性,但未初始化为Plate宾语。 (您在Index方法调用中执行的操作)

如果您想获得相同的版块实例,可以使用PassCoordinates操作方法以不同方式执行

  1. 让您的ajax调用发布Plate结构的js对象,并在Plate类型的操作方法中有一个参数。提交请求时,模型绑定器将能够构建新对象并映射不同proeprties的值

  2. 将Plate对象存储在持久性meedium中并阅读。因此,在Index操作方法中,您将创建对象,初始化proprety值并将其存储到db table / Session状态等。您可以在第二个操作方法中从此处再次读取它。使用静态变量是另一种选择

  3. 如果您要选择#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)

如果您希望维持每个用户

的请求的状态
  • 使用TempData集合,并确保每次都设置值。它们仅在下次请求时可用,如果您希望它们保留多个请求,则必须每次都设置它们。
  • 使用Session存储用户当前会话的值: https://msdn.microsoft.com/en-us/library/ms178581.aspx
  • 将其存储在Cookie中
  • 将其存储在查询字符串
  • 将其存储在数据库中
  • 将其存储在内存数据库或缓存服务中
  • 通过模型将值返回到下一个返回的cshtml页面,并将值放在输入表单字段中,以便通过下一篇文章传递给下一个请求

每种方法都有优点和缺点,没有更多信息,很难确定适当的选择。