質問欄のコメントに書いた、
ユーザーがドロップダウンリストから null を選択後どうするのですか? たぶん、その値をサーバーに送信して DB に NULL として反映させるのであろうと想像していますが、アクションメソッドで受け取る値をどうするのですか? Model の定義はどうなっているのですか?
・・・に返事がないので、勝手に想像して答えておきます。想像が違っていたらどこがどう違うのかをコメント欄に書いてください。
まず、Mac ではなくて Windows 10 を使っていて、Core 3.1 以降のバージョンが前提。Mac でどうなるかは知りません。
質問に書いてあった DropDownListFor のコードが問題なく動いているのか疑問ですが、そこはちょっと置いといて・・・
例えば DropDownList メソッドの第三引数に以下のように "NULL" という文字列を設定したとすると("選択してください" でも OK です)、
@Html.DropDownList("CategoryId", null, "NULL", htmlAttributes: new { @class = "form-control" })
それが html にレンダリングされると以下のようになります。value="" で NULL という項目が追加されているところに注目してください。
<select class="form-control" id="CategoryId" name="CategoryId">
<option value="">NULL</option>
<option value="1">Beverages</option>
<option value="2">Condiments</option>
<option value="3">Confections</option>
<option value="4">Dairy Products</option>
<option value="5">Grains/Cereals</option>
<option selected="selected" value="6">Meat/Poultry</option>
<option value="7">Produce</option>
<option value="8">Seafood</option>
</select>
ドロップダウンリストを開くと NULL という選択肢が含まれるようになるので、それを選択して POST すれば、データは「CategoryId=」という形でフォームに含まれて送信されます。
問題はアクションメソッドでそれをどのように受け取って処理できるかだと思います。
例えば Model が以下のように定義されているとするとします。CategoryId プロパティの型が int? であるところに注目してください。、
public partial class Product
{
[Key]
[Column("ProductID")]
public int ProductId { get; set; }
[Required]
[StringLength(40)]
public string ProductName { get; set; }
[Column("SupplierID")]
public int? SupplierId { get; set; }
[Column("CategoryID")]
public int? CategoryId { get; set; }
// ・・・中略・・・
}
それをアクションメソッドの引数に使って以下のようにモデルバインディングすれば良さそうです。
CategoryId が null になっているところに注目してください。それを DB に反映したいということであれば、Edit アクションメソッドであれば以下のようにすれば OK です。
_context.Update(product);
await _context.SaveChangesAsync();