iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0
SideProject30

我想自己刻部落格系列 第 22

實作 OptionService 與相關站台設定

  • 分享至 

  • xImage
  •  

原本想偷懶把一些站台設定,都寫在 Appsettings.json 裡面,不過之前開資料表的時候,其實已經定義了 Option 資料表,並設定了 OptionRepository 。還是實作一下 Option 相關功能。 包含 OptionService 、 Controller 與 View 的相關操作。並將 Layout 上的站台名稱改從 OptionService 取得。

詳細程式碼可以到 GitHub

建立 IOptionService 介面,並實作 OptionService

這邊先定義介面,列出會實作的方法。

public interface IOptionService
{
    public List<Option> GetAll();

    public Task<Option?> GetAsync(int id);

    public Option? GetByName(string nmae);

    public Task CreateAsync(Option option);

    public string GetValue(string name);

    public Task UpdateAsync(Option newOption);

    public Task RemoveAsync(int id);
}

詳細 OptionService 實作請到 GitHub 去看,這邊先寫 GetValue 、 UpdateAsync 兩個實作。GetValue 特別的點在於,這個專案是有啟動可為 Null 設定,若參考型別允許 Null 的話需要加上 ? 明確表示,否則一定會回傳物件。而在 UpdateAsync 時,需要注意如果 Name 有更改,需要檢查 Name 有無重複。

public Option? GetByName(string nmae)
{
    return _optionRepository.Query(x => x.Name == nmae).FirstOrDefault();
}

public string GetValue(string name)
{
    var option = GetByName(name);

    return option?.Name ?? string.Empty;
}

public async Task UpdateAsync(Option newOption)
{
    var option = await GetAsync(newOption.Id);

    if (option == null)
    {
        return;
    }
    if (option.Name != newOption.Name)
    {
        var hasNameOption = GetByName(newOption.Name);
        if (hasNameOption is not null)
        {
            return;
        }

        option.Name = newOption.Name;
    }

    option.Value = newOption.Value;
    _optionRepository.UnitOfWork.Save();
}

DI 註冊 IOptionService

Program.cs

builder.Services.AddTransient<IOptionService, OptionService>();

建立 Options 清單 Action 與其 View

public IActionResult Options()
{
    var options = _optionService.GetAll();
    return View(options);
}

建立 Options 的 List Html樣板
https://ithelp.ithome.com.tw/upload/images/20231007/201204206EC0NNezMN.png

其中編輯、刪除的對應 Action 稍作調整,移除 Details

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Value)
        </td>
        <td>
            <a asp-action="UpdateOption" asp-route-id="@item.Id">編輯</a> |
            <a asp-action="DeleteOption" asp-route-id="@item.Id">刪除</a>
        </td>
    </tr>
}

建立新增 Option 的 Action 與其 View

名稱我設為 CreateOption

public IActionResult CreateOption()
{
    return View();
}

[HttpPost]
public async Task<IActionResult> CreateOption(Option option)
{
    await _optionService.CreateAsync(option);
    return RedirectToAction("Options");
}

建立 CreateOption 的 Create Html樣板

https://ithelp.ithome.com.tw/upload/images/20231007/201204204poABUy7Ej.png

建立編輯 Option 的 Action 與其 View

名稱我設為 UpdateOption

public async Task<IActionResult> UpdateOption(int id)
{
    var option = await _optionService.GetAsync(id);
    return View(option);
}

[HttpPost]
public async Task<IActionResult> UpdateOption(Option option)
{
    await _optionService.UpdateAsync(option);
    return RedirectToAction("Options");
}

建立 UpdateOption 的 Edit Html樣板

https://ithelp.ithome.com.tw/upload/images/20231007/201204204poABUy7Ej.png

建立刪除 Option 的 Action 與其 View

名稱我設為 DeleteOption
https://ithelp.ithome.com.tw/upload/images/20231007/20120420pelcNy4xWZ.png
然後
表單送出對應的 Action 改為 DeleteOptionConfirmed , 返回對應的 Action 改為 Options

<form asp-action="DeleteOptionConfirmed">
    <input type="hidden" asp-for="Id" />
    <input type="submit" value="Delete" class="btn btn-danger" /> |
    <a asp-action="Options">返回</a>
</form>

https://ithelp.ithome.com.tw/upload/images/20231007/20120420FL4iihtxeL.png

將 Layout 上標示的站台名稱改為 OptionService 提供

在 Layout 的最上方,我們要注入 IOptionService ,並使用 optionService.GetValue() 取得站台名稱

@using MyBlog.Services;
@inject IOptionService optionService;
@{
    var siteName = optionService.GetValue("siteName");
}
<!DOCTYPE html>

詳細程式碼可以到 GitHub


上一篇
SimpleMDE 自訂繼續閱讀按鈕
下一篇
實作 Wordprss 資料匯入功能 - ImportService
系列文
我想自己刻部落格31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言