第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

避免MVC中重復(fù)代碼的通用視圖和控制器

避免MVC中重復(fù)代碼的通用視圖和控制器

C#
達(dá)令說 2022-11-21 20:45:01
在我的MVC項(xiàng)目中,我有很多具有相同基本結(jié)構(gòu)的模型。所以,我創(chuàng)建了一個(gè)像下面這樣的大師班。    public class MasterTemplate    {        [Key]        public int Id { get; set; }        [Required]        [StringLength(255)]        public string Description { get; set; }        public DateTime? UpdatedOn { get; set; }        public string UpdatedBy { get; set; }    }我創(chuàng)建了如下所有的模型類。    public class Industry : MasterTemplate    {    }    public class Caste : MasterTemplate    {    }    public class Gender : MasterTemplate    {    }    public class Qualification : MasterTemplate    {    }    public class BloodGroup: MasterTemplate    {    }像這樣的還有很多。下面是我的IndustryController代碼。 public class IndustryController : Controller    {        private ApplicationDbContext _context { get; set; }        private string UserId { get; set; }        public IndustryController()        {            _context = new ApplicationDbContext();            UserId = System.Web.HttpContext.Current.User.Identity.GetUserId();        }        public ActionResult Index(int id = 0)        {            Industry data = new Industry();            if (id > 0)                data = _context.Industries.SingleOrDefault(c => c.Id == id);            if (data == null)                data = new Industry();            return View("Industry", data);        }        [HttpPost]        [ValidateAntiForgeryToken]        public ActionResult Save(Industry data)        {            if (!ModelState.IsValid)                return View("Industry", data);            var record = _context.Industries.Where(c => c.Description.Trim().ToLower() == data.Description.Trim().ToLower() && c.Id != data.Id);            if (record.Count() > 0)            {                ModelState.AddModelError("Duplicate Industry", "Industry already exist");                return View("Industry", data);            }
查看完整描述

1 回答

?
胡子哥哥

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊

我還沒有運(yùn)行它,但我很有信心,這應(yīng)該做的伎倆!實(shí)際上,唯一真正通用的部分是控制器。另一個(gè)就是常見的多態(tài)性。謝謝你的啟發(fā)。想到這樣的解決辦法,真是有趣。也許將來我也會(huì)造類似的東西。


提醒一句:您將把控制器的名稱綁定到每個(gè)Model的名稱。只是要注意這一點(diǎn)!必須保留一個(gè)命名架構(gòu),否則會(huì)破壞它。


公共類[模型名稱]控制器:主控制器<型號(hào)Name>

{

}


阿賈克斯端點(diǎn)將以[PluralName]的值結(jié)束

(請(qǐng)繼續(xù)閱讀《觀點(diǎn)》,了解我的意思。)


您將需要在MasterTemplate中添加一個(gè)屬性。理想情況下使其抽象,這樣您就不會(huì)忘記在派生類中實(shí)現(xiàn)它。這適用于視圖頭中的復(fù)數(shù)名稱和視圖中的阿賈克斯調(diào)用。


public abstract class MasterTemplate

{

    [Key]

    public int Id { get; set; }


    public abstract string PluralName {get;}


    [Required]

    [StringLength(255)]

    public string Description { get; set; }

    public DateTime? UpdatedOn { get; set; }

    public string UpdatedBy { get; set; }

}

工業(yè)就會(huì)像這樣


public class Industry: MasterTemplate

{

  public override string PluralName => "Industries"

}

創(chuàng)建一個(gè)真正通用的Controller,并從它派生所有其他Controller,如


public class IndustryController : MasterController<Industry>

{

   //done everthing else is in the master :)

}

這里是通用的MasterController< T>。


public class MasterController<T> : Controller where T : MasterTemplate, new()

{

    private ApplicationDbContext _context { get; set; }

    private string UserId { get; set; }


    public MasterController()

    {

        _context = new ApplicationDbContext();

        UserId = System.Web.HttpContext.Current.User.Identity.GetUserId();

    }



    public ActionResult Index(int id = 0)

    {

        T data = (id > 0) 

               ? data = _context.Set<T>().SingleOrDefault(c => c.Id == id) ?? new T() 

               : new T();


        return View("View", data);

    }


    [HttpPost]

    [ValidateAntiForgeryToken]

    public ActionResult Save(T data)

    {

        if (!ModelState.IsValid)

            return View("View", data);


        var record = _context.Set<T>().Where(c => c.Description.Trim().ToLowerInvariant() == data.Description.Trim().ToLowerInvariant() && c.Id != data.Id);

        if (record.Count() > 0)

        {

            ModelState.AddModelError($"Duplicate {typeof(T).Name}", $"{typeof(T).Name} already exist");

            return View("View", data);

        }


        if (data.Id >= 1)

        {

            T cm = _context.Set<T>().SingleOrDefault(c => c.Id == data.Id);

            cm.Description = data.Description;

            cm.UpdatedOn = DateTime.Now;

            cm.UpdatedBy = UserId;

        }

        else

        {

            _context.Set<T>().Add(data);

        }

        _context.SaveChanges();



        return RedirectToAction("Index", new { id = 0 });


    }

將視圖命名為“View”(或與您在MasterController中的稱呼相同),并將其放置在共享文件夾中,以便每個(gè)控制器都能在那里找到它。


@model MasterTemplate

@{

    string name = Model.GetType().Name;

    ViewBag.Title = name;

    Layout = "~/Views/Shared/_Layout.cshtml";

}


<h3>@Model.PluralName Management</h3>

<div class="row">

    <div class="col-md-4">

        @using (@Html.BeginForm("Save", name))

        {

            @Html.ValidationSummary("Please correct the following")

            @Html.HiddenFor(m => m.Id)


            <div class="form-group">

                <div>

                    @Html.LabelFor(m => m.Description)

                    @Html.TextBoxFor(m => m.Description, new { @class = "form-control", autocomplete = "off" })

                    @Html.ValidationMessageFor(m => m.Description, $"{name} is required.", new { @class = "text-danger" })

                </div>

            </div>

            @Html.AntiForgeryToken()

            <button type="submit" class="btn btn-primary btn-sm">Save</button>

        }

    </div>

    <div class="col-md-8">

        <table class="table table-sm" id="mydata">

            <thead>

                <tr>

                    <th>

                        @(name)

                    </th>

                    <th>


                    </th>

                </tr>

            </thead>

            <tbody></tbody>

        </table>

    </div>

</div>



@section scripts

{

    @Scripts.Render("~/bundles/jqueryval")

    <script>

        $(document).ready(function () {

            $("#mydata").DataTable({

                ajax: {

                    url: "/api/get/@(Model.PluralName)",

                    dataSrc: ""

                },

                columns: [

                    {

                        data: "description"

                    },

                    {

                        data: "id",

                        render: function (data) {

                            var url = '@Url.Action("Index", "@(name)", new { id = "__data__" })';

                            return '<a href="' + url.replace('__data__', data) + '">Edit</a>';

                        }

                    }

                ]

            });

        });

    </script>

}




查看完整回答
反對(duì) 回復(fù) 2022-11-21
  • 1 回答
  • 0 關(guān)注
  • 123 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)