我很难在视图中解决一个简单的请求,从另一个控制器绑定。
参见下一个屏幕截图:
所以我想要选择一些要添加并与产品关联的组件的CheckBoxList
页面(产品由多个组件组装而成)
如第二次截图所示,我得到了产品的ID(那里是“1016”)。
关联后,将使用组件列表更新“产品”页面。
我尝试在我的组件视图页面中添加@using PRODCHARv5.Models
并在产品控制器(/详细信息)中请求但没有成功。所以我从代码中删除了它。
怎么做?
产品型号
public partial class PRODUCT
{
public PRODUCT()
{
this.COMPONENT = new HashSet<COMPONENT>();
}
public int IDPRODUCT { get; set; }
[Required(ErrorMessage = "The field is required"), StringLength(50, MinimumLength = 3), Display(Name = "Product Line")]
public string PRODUCTLINE { get; set; }
[Required(ErrorMessage = "The field is required"), StringLength(50, MinimumLength = 3), Display(Name = "Product Family")]
public string PRODUCTFAMILY { get; set; }
[Required(ErrorMessage = "The field is required"), StringLength(50, MinimumLength = 3), Display(Name = "Product Description")]
public string PRODUCTDESCRIPTION { get; set; }
public string PRODUCTVERSION { get; set; }
public virtual ICollection<COMPONENT> COMPONENT { get; set; }
}
COMPONENT模型
public partial class COMPONENT
{
public COMPONENT()
{
this.PRODUCT = new HashSet<PRODUCT>();
this.COMPOCHARACDAT = new HashSet<COMPOCHARACDAT>();
}
public int IDCOMPONENT { get; set; }
[Required(ErrorMessage = "The field is required"), StringLength(50, MinimumLength = 3), Display(Name = "Component Name")]
public string COMPONENTNAME { get; set; }
[Required(ErrorMessage = "The field is required"), StringLength(50, MinimumLength = 3), Display(Name = "Component Class Code")]
public string COMPONENTCLASSCODE { get; set; }
[Required(ErrorMessage = "The field is required"), StringLength(50, MinimumLength = 3), Display(Name = "Component Function")]
public string COMPONENTFUNCTION { get; set; }
[Display(Name = "Aera Numbering Range")]
public string COMPONENTAERANUMBERINGRANGE { get; set; }
public bool IsChecked { get; set; }
public virtual ICollection<PRODUCT> PRODUCT { get; set; }
public virtual ICollection<COMPOCHARACDAT> COMPOCHARACDAT { get; set; }
}
public class ComponentModel
{
public List<COMPONENT> Components { get; set; }
}
PRODUCT控制器
// GET: PRODUCTs/Details/5
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
PRODUCT pRODUCT = db.PRODUCT.Find(id);
if (pRODUCT == null)
{
return HttpNotFound();
}
return View(pRODUCT);
}
COMPONENT控制器
// GET: COMPONENTs/Details/5
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
COMPONENT cOMPONENT = db.COMPONENT.Find(id);
if (cOMPONENT == null)
{
return HttpNotFound();
}
return View(cOMPONENT);
}
@using PRODCHARv5.Models
@model PRODCHARv5.Models.ComponentModel
@{
ViewBag.Title = "BoxList";
}
<a name="top"></a>
<h2>COMPONENT BoxList</h2>
<br />
@{
var id = Request.Url.Segments.Last();
<label> L'ID du produit est : @id</label>
}
<br />
@using (Html.BeginForm())
{
<table class="table table-hover">
<tr>
@*<th></th>*@
<th></th>
<th>
Name
</th>
<th>
Component Code
</th>
<th>
Function
</th>
</tr>
@for (int i = 0; i < Model.Components.Count; i++)
{
if (i % 4 == 0)
{
@:
<tr></tr>
}
<tr>
<td>
@Html.CheckBoxFor(model => model.Components[i].IsChecked)
@Html.HiddenFor(model => model.Components[i].IDCOMPONENT)
@Html.HiddenFor(model => model.Components[i].COMPONENTNAME)
</td>
@*<td></td>*@
<td>
<label>@Model.Components[i].COMPONENTNAME</label>
</td>
<td>
<label>@Model.Components[i].COMPONENTCLASSCODE</label>
</td>
<td>
<label>@Model.Components[i].COMPONENTFUNCTION</label>
</td>
</tr>
}
</table>
<input type="submit" value="Submit" class="btn btn-success btn-sm" />
}
<br />
<a href="#" class="btn btn-default btn-xs" role="button">Back to Top</a>
答案 0 :(得分:0)
我不确定我是否正确地从您的描述中正确地解决了问题。
因此,您有一个产品和一个组件列表,并且您希望显示用户选择的组件列表,然后将它们添加到产品中。
这意味着您有两个要处理的组件列表,1表示已与产品关联的组件列表,这些组件将作为您通过其ID加载的Product对象的一部分返回。第二个是您可以选择的所有可用组件的列表。
如果我的理解是正确的,那么这就是我要做的事情:
在产品控制器中,我不会只返回产品,而是返回一个新的组件对象列表,它只包含视图需要使用的内容,这意味着一个带有布尔标志的组件列表,表示关联与否。对于已经部分产品的每个组件,将此属性设置为true,然后在视图中,您可以显示复选框或任何您想要允许选择和取消选择组件的内容。
将您的视图所需的任何其他属性添加到这些新的Component对象中。
不要考虑如何从产品控制器调用组件控制器,答案很简单,不要。这就是“关注分离”原则发挥作用的地方。
构建一个数据层,您可以将其注入您需要的任何控制器,并在您需要的任何地方使用它。这基本上简化了一切。您可能想要创建一种加载组件数据的新方法,您不希望继续为每个组件调用数据层,通过传递所需ID的列表来执行批量调用,然后在一个组件中获得所需的所有内容打电话到数据库。