ASP MVC绑定另一个控制器

时间:2017-09-07 13:13:14

标签: asp.net-mvc data-binding

我很难在视图中解决一个简单的请求,从另一个控制器绑定。

参见下一个屏幕截图:

起始页面 enter image description here

所以我想要选择一些要添加并与产品关联的组件的CheckBoxList页面(产品由多个组件组装而成) enter image description here

如第二次截图所示,我得到了产品的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>

1 个答案:

答案 0 :(得分:0)

我不确定我是否正确地从您的描述中正确地解决了问题。

因此,您有一个产品和一个组件列表,并且您希望显示用户选择的组件列表,然后将它们添加到产品中。

这意味着您有两个要处理的组件列表,1表示已与产品关联的组件列表,这些组件将作为您通过其ID加载的Product对象的一部分返回。第二个是您可以选择的所有可用组件的列表。

如果我的理解是正确的,那么这就是我要做的事情:

在产品控制器中,我不会只返回产品,而是返回一个新的组件对象列表,它只包含视图需要使用的内容,这意味着一个带有布尔标志的组件列表,表示关联与否。对于已经部分产品的每个组件,将此属性设置为true,然后在视图中,您可以显示复选框或任何您想要允许选择和取消选择组件的内容。

将您的视图所需的任何其他属性添加到这些新的Component对象中。

不要考虑如何从产品控制器调用组件控制器,答案很简单,不要。这就是“关注分离”原则发挥作用的地方。

构建一个数据层,您可以将其注入您需要的任何控制器,并在您需要的任何地方使用它。这基本上简化了一切。您可能想要创建一种加载组件数据的新方法,您不希望继续为每个组件调用数据层,通过传递所需ID的列表来执行批量调用,然后在一个组件中获得所需的所有内容打电话到数据库。