Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 使用Viewmodel填充sql数据并添加列_Asp.net Mvc - Fatal编程技术网

Asp.net mvc 使用Viewmodel填充sql数据并添加列

Asp.net mvc 使用Viewmodel填充sql数据并添加列,asp.net-mvc,Asp.net Mvc,我想创建一个表的模型,并创建一个带有添加字段的viewmodel,然后将其填充为视图。如何在控制器中执行此操作?当它仅仅是一个模型时,它就工作了,但当它是一个viewmodel时,我不知道如何做同样的事情。我是asp.net mvc的新手,因此任何帮助都将不胜感激 型号: public partial class tblTag { public int TagId { get; set; } public strin

我想创建一个表的模型,并创建一个带有添加字段的viewmodel,然后将其填充为视图。如何在控制器中执行此操作?当它仅仅是一个模型时,它就工作了,但当它是一个viewmodel时,我不知道如何做同样的事情。我是asp.net mvc的新手,因此任何帮助都将不胜感激

型号:

        public partial class tblTag
        {
            public int TagId { get; set; }
            public string TagName { get; set; }
        }
视图模型:

public class tblTagViewModel
{
    public string TagName { get; set; }

    public string TagNameClr
    {
        get
        {
            if (TagName == "Test")
            {
                return "green";
            }
            else
            {
                return "red";
            }
        }
    }
}
控制器:

public class HomeController : Controller
{
    private readonly Service _service;
    public HomeController(IRepository repository)
    {
        if (repository == null)
            throw new ArgumentNullException("repository");
        _service = new Service(repository);
    }


    public ActionResult Test()
    {
        List<ViewModel.tblTagViewModel> list = new List<ViewModel.tblTagViewModel>();
        vat taglist = _service.GetTagList();
        foreach (tblTag p in taglist)
        {
            ViewModel.tblTagViewModel nw = new ViewModel.tblTagViewModel();
            nw.TagName = p.TagName;
            list.Add(nw);
        }

        return View(list);
    }
}
无法将类型“System.Data.Entity.DbSet”隐式转换为“\u 1MvcSqlServer.ViewModel.tblTagViewModel”

现在它是一个viewmodel,实体的结构不同了,我认为这就是问题所在。我如何解决这个问题

private testEntities db = new testEntities();

public ActionResult Test()
{
        ViewModel.tblTagViewModel model = new ViewModel.tblTagViewModel();
        model = db.tblTags;
        return(model);
}
这是我最终得到的让它工作的东西。这是正确的方法吗

        public ActionResult Test()
    {
        List<ViewModel.tblTagViewModel> list = new List<ViewModel.tblTagViewModel>();
        var model = new ViewModel.tblTagViewModel();
        foreach(tblTag p in db.tblTags)
        {
            ViewModel.tblTagViewModel nw = new ViewModel.tblTagViewModel();
            nw.TagName = p.TagName;
            list.Add(nw);
        }

        return View(list);
    }
公共操作结果测试()
{
列表=新列表();
var model=new ViewModel.tblTagViewModel();
foreach(以db.tblTags为单位的tbltagp)
{
ViewModel.tblTagViewModel nw=新的ViewModel.tblTagViewModel();
nw.TagName=p.TagName;
列表。添加(西北);
}
返回视图(列表);
}

正确的方法-创建业务层,它将从DB层获取数据并将此数据传递给View层(反之亦然,从View层获取数据并传递给DB层)

此外,我还建议考虑国际奥委会(DI)的方法:

业务层:

首先,创建新的类库项目,创建业务层POCO类和存储库的抽象:

/// <summary>
/// this is a Business layer class, which is very similar on EF class
/// </summary>
public class Tag
{
    public int TagId { get; set; }
    public string TagName { get; set; }
}

public interface IRepository
{
    List<Tag> GetTagList();
}
和您的控制器:

public class HomeController : Controller
{
    private readonly Service _service;
    public HomeController(IRepository repository)
    {
        if (repository == null)
            throw new ArgumentNullException("repository");
        _service = new Service(repository);
    }


    public ActionResult Test()
    {
        List<ViewModel.tblTagViewModel> list = new List<ViewModel.tblTagViewModel>();
        vat taglist = _service.GetTagList();
        foreach (tblTag p in taglist)
        {
            ViewModel.tblTagViewModel nw = new ViewModel.tblTagViewModel();
            nw.TagName = p.TagName;
            list.Add(nw);
        }

        return View(list);
    }
}
请注意,您的web应用程序不依赖于DB层,它只依赖于BL层(这也是合乎逻辑的)。在您的web应用程序中,只有一个地方可以设置eRepository—控制器工厂中

使用这种方法,您可以轻松地将eRepository更改为IRepository的另一个实现,使用不同的DB甚至伪DB。您可以测试应用程序的任何部分,而不需要不必要的关系。您拥有强大且正确的体系结构,其中您的应用程序依赖于业务逻辑层,而不依赖于数据库层等。数据库层或视图层中的任何更改都不会影响逻辑层


对于使用许多属性映射类似的POCO类(即BL和DB、BL和视图类),您可以使用Automapper

您的最后一个代码段很好,尽管您可以将其简化为
var list=DB.tblTags.Select(t=>new-tblTagViewModel{TagName=t.TagName})ToList();返回视图(列表)谢谢这就是我要找的!我知道这很简单。谢谢,这对我理解一个好的结构和仅仅因为它工作就把东西拼凑在一起是非常有帮助的。刚开始,我让entity framework为我的表做所有事情,我知道我需要了解那里发生的事情,以便能够以正确的方式做事。@curiousgeorge我建议您阅读这本书:
public class tblTagViewModel
{
    public string TagName { get; set; }

    public string TagNameClr
    {
        get
        {
            if (TagName == "Test")
            {
                return "green";
            }
            else
            {
                return "red";
            }
        }
    }
}
public class HomeController : Controller
{
    private readonly Service _service;
    public HomeController(IRepository repository)
    {
        if (repository == null)
            throw new ArgumentNullException("repository");
        _service = new Service(repository);
    }


    public ActionResult Test()
    {
        List<ViewModel.tblTagViewModel> list = new List<ViewModel.tblTagViewModel>();
        vat taglist = _service.GetTagList();
        foreach (tblTag p in taglist)
        {
            ViewModel.tblTagViewModel nw = new ViewModel.tblTagViewModel();
            nw.TagName = p.TagName;
            list.Add(nw);
        }

        return View(list);
    }
}
public class MyControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        var efRepository = new EFRepository();
        if (controllerType == typeof(HomeController))
        {
            return new HomeController(efRepository );
        }

        return base.GetControllerInstance(requestContext, controllerType);
    }