亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

C#
達令說 2022-11-21 20:45:01
在我的MVC項目中,我有很多具有相同基本結構的模型。所以,我創建了一個像下面這樣的大師班。    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; }    }我創建了如下所有的模型類。    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貢獻1825條經驗 獲得超6個贊

我還沒有運行它,但我很有信心,這應該做的伎倆!實際上,唯一真正通用的部分是控制器。另一個就是常見的多態性。謝謝你的啟發。想到這樣的解決辦法,真是有趣。也許將來我也會造類似的東西。


提醒一句:您將把控制器的名稱綁定到每個Model的名稱。只是要注意這一點!必須保留一個命名架構,否則會破壞它。


公共類[模型名稱]控制器:主控制器<型號Name>

{

}


阿賈克斯端點將以[PluralName]的值結束

(請繼續閱讀《觀點》,了解我的意思。)


您將需要在MasterTemplate中添加一個屬性。理想情況下使其抽象,這樣您就不會忘記在派生類中實現它。這適用于視圖頭中的復數名稱和視圖中的阿賈克斯調用。


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; }

}

工業就會像這樣


public class Industry: MasterTemplate

{

  public override string PluralName => "Industries"

}

創建一個真正通用的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中的稱呼相同),并將其放置在共享文件夾中,以便每個控制器都能在那里找到它。


@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>

}




查看完整回答
反對 回復 2022-11-21
  • 1 回答
  • 0 關注
  • 119 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號