如何将ASP Net Membership Provider UserId保存到另一个sql表中?

时间:2015-12-31 20:43:50

标签: c# mysql asp.net asp.net-mvc asp.net-mvc-4

我想获取和保存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

2 个答案:

答案 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。你不能自动完成。