如果项目已经在数据库中,请在视图中执行不同的 ActionResult - ASP.NET MVC4 EF5 HTML5

Posted

技术标签:

【中文标题】如果项目已经在数据库中,请在视图中执行不同的 ActionResult - ASP.NET MVC4 EF5 HTML5【英文标题】:If item already in Database, do different ActionResult in View - ASP.NET MVC4 EF5 HTML5 【发布时间】:2013-04-23 10:11:50 【问题描述】:

如果我要转到“项目”的简单 Index() 视图,请说。 我在该索引视图中有一个操作结果,它添加到数据库中(这将是一个在模型中具有项目库的客户)。如果客户已经在数据库中拥有该选择的项目,我希望 ActionLink 显示类似

@html.ActionLink("Remove from Library", "RemoveFromLibrary", new id=item.Id)

客户模型

public List<LoanedItem> Library  get; set; 

项目索引视图

@Html.ActionLink("Add To Library", "AddToItems", new id=item.Id)

我将如何以最简单的方式解决这个问题? (我是新手)

谢谢

附言。在现实场景中,它就像一个 ebay 监视列表。如果某个项目已在关注列表中,则显示要从该项目的关注列表中删除的文本

编辑:

我不确定是在 Controller 中编写代码还是在视图本身中编写代码,但对于视图,我尝试添加以下内容并卡住了

public ActionResult Index()
    
        Customer c = (Customer)Session["customer"];
        var items = ItemRepository.GetItems().OfType<Item>();
        var itemsLoanedToCustomer = customerRepository.GetItems(c.Id);
        foreach (Item i in items)
        
            if (itemsLoanedToCustomer.Contains(i))
            

            
        
        return View();
    

完整索引()视图

    @model IEnumerable<MMC.Model.Item>

@
    ViewBag.Title = "Index";


<h2>Tracks</h2>

<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Artist)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Genre)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.DailyLoanPrice)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Publisher)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.ReleaseDate)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Title)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.YearOfPublication)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) 
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Artist)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Genre)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.DailyLoanPrice)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Publisher)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ReleaseDate)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Title)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.YearOfPublication)
        </td>
        <td>
            @Html.ActionLink("Details", "Details", new  id=item.Id ) |
            @Html.ActionLink("Add To Library", "AddToTracks", new id=item.Id)

        </td>
    </tr>


</table>

客户模型

    public class Customer


    public int Id  get; set; 
    public string ForeName  get; set; 
    public string SurName  get; set; 
    public Address address  get; set; 
    public string Email  get; set; 
    public string Telephone  get; set; 
    public string Mobile  get; set; 
    public List<LoanedItem> MediaLibrary  get; set; 
    public Bill balance  get; set; 

    public Customer()
    
        if (Library == null)
        
            Library = new List<LoanedItem>();
        
    

物品模型

    public class Item

    public int Id  get; set; 
    public double DailyLoanPrice  get; set; 

    [DisplayFormat(DataFormatString = "0:yyyy/MM/dd", ApplyFormatInEditMode = true)]
    public DateTime LastTimeBorrowed  get; set; 
    public int NumberOfTimeBorrowed  get; set; 
    public string Publisher  get; set; 
    //rating
    [DisplayFormat(DataFormatString = "0:yyyy/MM/dd", ApplyFormatInEditMode = true)]
    public DateTime ReleaseDate  get; set; 
    public string Title  get; set; 
    public double TotalSalesIncome  get; set; 
    public int YearOfPublication  get; set; 

【问题讨论】:

如果他们已经拥有它,请将其删除并重新添加?你的问题不清楚。你试过什么代码? @SamLeach 请见上文 【参考方案1】:

您从哪里获得要显示其操作链接的 LibraryItems 列表?如果它们在您的模型中,那么;

在视图中检查用户是否已经拥有该项目并相应地显示操作链接。

@(if(Model.Customers.Items.Select(x => x.Id).Intersect(Model.Items.Select(x => x.Id)).Any())

    Html.ActionLink("Remove from Library", "RemoveFromLibrary", new id=item.Id);

else

    Html.ActionLink("Add To Library", "AddToItems", new id=item.Id);
)

此外,如果您使用的是 EF,则可以执行类似的操作

public ActionResult Index()

    Customer c = (Customer)Session["customer"];

    // Items is the navigation property.
    var customerItems = customerRepository.GetItems(c.Id).Items;

    return View();

使用下面的 ViewModel

public class CustomerItem

    public List<Item> Items;
    public List<Customer> Customers;

    public CustomerItem()
    
        Items = new List<Items>();
        Customers = new List<Items>();
    

【讨论】:

好吧,这个视图是强类型的,并且强类型为“项目”,因此无法在视图中以这种方式获取库项目。每个客户的库项目位于 customerRepository 而不是 trackrepository 中。此视图包含可用项目目录中的所有项目。客户只有少数存储在客户模型中的个人库中。本质上,我需要的是 ebay 监视列表的功能。如果该项目已在关注列表中,则显示从关注列表中删除 如何在视图示例中使用您的添加? 发布您的完整视图和所有使用过的模型,我可以为您提供帮助。 已添加,查看原帖 您需要更改您的视图模型以包括客户和项目。

以上是关于如果项目已经在数据库中,请在视图中执行不同的 ActionResult - ASP.NET MVC4 EF5 HTML5的主要内容,如果未能解决你的问题,请参考以下文章

如何从android的listview中的不同项目获取数据

oracle 视图sql语句怎么写

IOS:后退两个视图

在 Autodesk forge 中选择的项目中获取不同的 3d 视图

有没有办法可以在Django中的同一个模板中渲染多个视图?如果有最佳实践可以做到这一点?提前致谢

如果集合视图已经存在以执行任务,为啥 Xcode 提供 Tableview [重复]