MVC, C#:如何将父级id传递给子级Index或Create操作?

3

我找到的与我的问题最接近的是这个,但我不明白它该如何使用。

<% object parentModel = ViewContext.ParentActionViewContext.ViewData.Model; %>

我有一个“网关”表和一个“传感器”表。网关可以拥有多个传感器。这两个表之间的关联是一对多(网关到传感器),传感器表有一个“gatewayid”字段,用于将传感器与网关相关联。
我正在使用实体框架,有一个网关存储库类、一个网关控制器类、一个网关部分伙伴类来处理数据注释,以及一个索引视图,列出网关并提供经典的crud页面。
在网关列表上,我添加了一个操作链接,以列出与给定网关相关联的传感器。
到目前为止都很好(我希望如此)。
我假设现在应该为我的传感器表创建相同的设置:存储库、控制器、伙伴类等。
问题1:列出给定网关(父记录)的所有传感器(子记录)的MVC方法是什么?
在每个网关行项目中,我生成了一个链接,看起来像这样:
localhost/sensor/list/5

这意味着列表应仅显示当前网关的传感器。

我认为这不是正确的方法。我认为我应该在后台传递一个网关模型,以便每次发出这样的链接时:

localhost/sensor/

它只需要理解当前网关的上下文。

Q2:接下来的问题是如何为传感器创建操作做同样的事情。我可以设置创建控制器并弹出视图表单,但如何指示传感器应与哪个网关相关联?

在SensorController类顶部:

SensorRepository repository = new SensorRepository();
GatewayRepository Grepository = new GatewayRepository();

我的传感器列表ActionResult方法如下:

public ActionResult List(int id)
{
    Gateway gateway = Grepository.GetGateway(id);

    var sensors = repository.FindGatewaySensors(id);
    return View(sensors);
}

我的传感器 Create ActionResult 方法如下(请注意,我在将其传递给视图之前设置了 gatewayid 值;它在视图表单中不可编辑):

// GET: /Sensor/Create
public ActionResult Create(int id)
{
    Sensor sensor = new Sensor();

    sensor.gatewayid = id;
    return View(sensor);

} 

这是Create ActionResult的post方法:

[HttpPost]
public ActionResult Create(FormCollection collection)
{

    Sensor sensor = new Sensor();

    if (TryUpdateModel(sensor))
    {
        repository.Add(sensor);
        repository.Save();
        return RedirectToAction("List", new { id = sensor.gatewayid });
    }
    return View(sensor);
}

但这似乎不太对。我敢打赌我错过了一个简单的方法。请启发我。


请在您的帖子中不要使用签名或标语 - user229044
1个回答

0

我不知道这是否还有关系(旧问题),但以下是一些对此的看法(仅限于个人意见)。

对于Q1,我更喜欢使用我想象中的具有MVC的“逻辑”URL - 即从用户的角度来看,URL应该让他们知道他们可能要获取的资源。由于您可以进行一些半花哨的路由,因此可能会有一个聪明的路由,例如:

/gateways/5/sensorlist

或类似主题的变化。当然,您可以通过会话变量或会话cookie等方式设置“当前”网关的数量,但是如果有人复制URL并将其发送给他的朋友,说“检查此坏男孩网关上的传感器!” - 没有参考网关它不起作用(不必是ID,有些人认为暴露数据库ID是一件坏事)。

至于Q2,我的常见解决方案基本上是在创建视图的表单中包含一个隐藏字段,指示您要为其创建传感器的网关的ID。这很干净,而且有效,对我来说通常已经足够了。

如果您半年后仍在等待答案,希望这些内容能对您有所帮助! :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接