我想获取和保存ASP NET MVC成员资格提供程序UserProfile表UserId字段到一个单独的表?
这是我的模特
public class Product
{
public int ProductId { get; set; }
public int UserId { get; set; }
public string ProductName { get; set; }
}
我不想再将UserId字段添加到我的模型中。 这是我的控制器:
private UsersContext db = new UsersContext();
// GET: /ProCont/
int UserID = (int)Membership.GetUser().ProviderUserKey;
public ActionResult Index()
{
return View(db.Products.Where(p => p.UserId == UserID).ToList());
}
怎么办?
此致 Dostdar
答案 0 :(得分:1)
免责声明:在现有答案中编辑时间太长,因此会在单独的答案中发布。
要回答关于如何在模型对象中添加UserID
字段的问题,请参阅下面的代码段详细说明。
考虑到您已使用Products
添加了ADO.NET Entity Data Model
实体。使用您喜欢的任何名称将单独的类文件添加到Models
文件夹,并使用以下代码。下面的代码段装饰你的模型对象。
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;
namespace MvcApplication1.Models
{
[MetadataType(typeof(productMetadata))]
public partial class Product
{
}
public class productMetadata
{
[HiddenInput(DisplayValue = false)]
public int ProductId { get; set; }
// to make the field hidden and will not display in browser
[HiddenInput(DisplayValue = false)]
//directing that don't scaffold this column since it will be added manually
[ScaffoldColumn(false)]
public int UserId { get; set; }
}
}
您可以直接在EF中修改自动生成的Product
类,但如果再次重新生成EF模型,则更改将会消失。因此,上面显示的方法最好使用MetadataType
属性。
控制器操作方法:
namespace MvcApplication1.Controllers
{
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
return View();
}
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create([Bind(Include = "ProductName, ProductId")]Product product)
{
SampleContext db = new SampleContext();
if (ModelState.IsValid)
{
product.UserId = (int)Membership.GetUser().ProviderUserKey;
db.Products.Add(product);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(product);
}
public ActionResult List()
{
SampleContext db = new SampleContext();
IEnumerable<Product> products = db.Products.ToList();
return View(products);
}
}
}
查看(特别是“创建”视图):
@model MvcApplication1.Models.Product
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Product</legend>
<div class="editor-label">
@Html.LabelFor(model => model.ProductName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ProductName)
@Html.ValidationMessageFor(model => model.ProductName)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
请注意,该视图只有productname
的可编辑控件作为输入字段,因为ProductID
是一个标识列,UserID
在代码中获取值,而不是来自用户。
答案 1 :(得分:0)
你真的不清楚你在这里问的是什么?但是你是说要将UserID
存储到数据库中的Products
表中。然后你可以指定你的模型类,如下所示
[System.ComponentModel.DataAnotations.Table("Products")]
public class Product
{
public int ProductId { get; set; }
public int UserId { get; set; }
public string ProductName { get; set; }
}
您可以手动创建表Products
,也可以使用EF code first Migrations
创建快照并更新数据库以添加新创建的表。
然后您可以将数据添加到表中,如
Product p1 = new Product
{
UserID = (int)Membership.GetUser().ProviderUserKey,
ProductName = "XXX";
};
db.Products.Add(p1);
db.SaveChanges();
根据你的评论:
您目前拥有的是正确的方法,否则您无法将产品与特定用户联系起来。这就是所谓的Referential Integrity Constraint
。此模型类中的UserID
充当FOREIGN KEY
。你不能自动完成。